Создайте тип-обёртку, который является строковым выражением и может инициализироваться вашим типом. После задайте их соответствие с помощью специализации шаблона
.
struct car_info {
std::string model;
int year;
};
struct car_info_expr {
const car_info& car_;
expr_num<char, int> year;
car_info_expr(const car_info& car) : car_(car), year(car.year){}
inline static constexpr ssa ModelTag = "Model: ";
inline static constexpr ssa YearTag = ", Year: ";
using symb_type = char;
size_t length() const {
return ModelTag.
length() + car_.model.length() + YearTag.length() + year.length();
}
char* place(char* ptr) const {
ptr = ModelTag.place(ptr);
std::char_traits<char>::copy(ptr, car_.model.data(), car_.model.length());
ptr += car_.model.length();
ptr = YearTag.place(ptr);
return year.place(ptr);
}
};
}
template<>
struct convert_to_strexpr<char, tests::car_info> {
using type = tests::car_info_expr;
};
}
namespace simstr::tests {
TEST(ToStrExpr, CheckCarInfo) {
car_info ci{"Ford", 2020};
std::string test = "Car is <"_ss + ci + ">";
EXPECT_EQ(test, "Car is <Model: Ford, Year: 2020>");
ci.year++;
test =
e_concat(
"",
"Car is <", ci,
">");
EXPECT_EQ(test, "Car is <Model: Ford, Year: 2021>");
ci.year++;
test =
e_subst(S_FRM(
"Car is <{}>"), ci);
EXPECT_EQ(test, "Car is <Model: Ford, Year: 2022>");
}