我从 C++11 中的可变参数模板开始,我想知道是否可以创建一个从模板参数中获取其名称的结构/类方法
类似于:
MySmartTemplate<"foo", int, "bar", double> MyStruct;
// which should result in:
struct MyStruct
{
void foo(int val){...}
void bar(double val){...}
};
其中模板参数可能成对出现,如
谢谢
最佳答案
模板根本不可能做到这一点。 C++ 中的模板由一个或多个模板参数列表参数化。他们每个人都可以是:
- 一个非类型模板参数;
- 类型模板参数;
- 一个模板模板参数。
现在,为了能够(理论上)构建类似 void foo(int val){...}
的东西,您需要将“foo”的名称及其参数类型传递到我们的虚构的模板。虽然传递 val
的类型不是问题,但传递“foo”的名称是不可能的。您可以使用的唯一非类型模板参数是:
- std::nullptr_t;
- 整体型;
- 左值引用类型(对象或函数);
- 指针类型(指向对象或函数);
- 指向成员类型(指向成员对象或成员函数)的指针;
- 枚举类型。
您还应该注意,引用和指针类型的非类型模板参数有一些异常(exception),即它们不能引用或作为字符串文字的地址(相关:this question)。考虑到上述情况,无法将字符串文字传递给模板,因此无法使用模板实现您想要的。
附带说明一下,虽然可变参数模板是对语言的一个很好的补充,但它们有一些限制,即您只能执行参数包的扩展,但不能处理包中的单个参数。
因此,总而言之,不,模板无法满足您的需求。
关于来自模板参数的 C++ 通用模板方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33099226/