C++在编译时将模板类定义传递给宏
C++ Pass Template class definition to a Macro in compile time
我必须使用库中具有可变参数的函数(createObject),一般用法为:
Class Point
{
public:
Point() {};
int x;
int y;
const char* name;
}
int main()
{
Point p;
createObject("%d",p.x,"%f",p.y,"%d",1,"%s",p.name);
}
现在我想用宏和模板来概括这个函数的用法,比如:
#define PARAM_Matrix(obj) "%d",obj.m,"%d",obj.n,"%d %d",obj[0][0],"%d %d",obj[0][1],"%d %d",obj[0][2]
#define PARAM_Person(obj) "%d",obj.age,"%s",obj.name
#define PARAM_Point(obj) "%d",obj.x,"%f",obj.y,"%d",1,"%s",obj.name
#define MAKE_PARAM(className,obj) PARAM_##className(obj)
class Person;
class Matrix;
class Point
{
public:
Point() {};
int x;
int y;
const char* name;
}
template<typename T> createGeneralize(T t)
{
return createObject(MAKE_PARAM(T,t));
}
int main()
{
Person per;
Matrix m;
Point p;
createGeneralize<Person>(per);
createGeneralize<Matrix>(m);
createGeneralize<Point>(p);
}
我预计在createGeneralize()
中,C++编译器会将宏扩展到MAKE_PARAM(Point,t)
(或MAKE_PARAM(Matrix,t)…)。然而,事实并非如此,它总是扩展到MAKE_PARAM(T)
。
您的想法是不可行的,因为预处理器宏在实际编译之前会转换为文本。而模板参数在编译期间被替换。所以你会得到这样的东西:
doMore (Point p)
{
T u, v; u = v;
}
我建议只使用模板。
您可以使用模板:而不是宏
auto as_tuple(const Person& obj) { return std::make_tuple("%d", obj.age, "%s", obj.name); }
auto as_tuple(const Matrix& obj) { return std::make_tuple("%d", obj.m,"%d",obj.n,"%d %d",obj.obj[0][0],"%d %d",obj.obj[0][1],"%d %d",obj.obj[0][2]); }
auto as_tuple(const Point& obj) { return std::make_tuple("%d", obj.x,"%f",obj.y,"%d",1,"%s",obj.name); }
template<typename Tuple, std::size_t...Is>
void createGeneralize(const Tuple& t, std::index_sequence<Is...>)
{
return createObject(std::get<Is>(t)...);
}
template<typename T> void createGeneralize(const T& t)
{
const auto& tuple = as_tuple(t);
return createGeneralize(tuple, std::make_index_sequence<std::tuple_size<std::decay_t<decltype(tuple)>>::value>());
}
实例
相关文章:
- 编译C++时未定义的引用
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 编译时的 CImg 库返回对"__imp_SetDIBitsToDevice"的未定义引用
- 未定义的引用 .. 使用 OpenCV 编译 C++ 代码时,从命令行
- 标准是否严格定义了该程序应该如何编译?
- 如何摆脱为条件编译定义预处理器宏的需要?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 在编译它时显示未定义的引用
- 使用宏编译时使用用户定义的数学函数,或者仅使用 c++ 中标准数学库中的函数
- 快捷方式在C 中编写自定义编译命令时
- C++静态枚举类成员的"多重定义"编译错误
- 有没有办法自定义编译错误/警告消息
- C++自定义编译时检查
- 通过宏定义编译标志(C++11 和优化)
- 无法使用类属性代码定义编译 c++
- 定义编译时常数的最佳方式
- 构造自定义编译库的更好方法
- 访问未定义的子类型时出现自定义编译错误消息
- 为什么易失性静态成员初始化会生成重新定义编译错误