我从C ++ 11中的可变参数模板开始,我想知道是否可以创建一个从模板参数中获取其名称的struct / class方法
类似的东西:
MySmartTemplate<"foo", int, "bar", double> MyStruct;
// which should result in:
struct MyStruct
{
void foo(int val){...}
void bar(double val){...}
};
其中模板参数可能成对地为&lt; name&gt; +&lt; type&gt;
由于
答案 0 :(得分:2)
根本不可能使用模板。 c ++中的模板由一个或多个模板参数的列表参数化。他们每个人可能是:
现在,为了能够(理论上)构造类似void foo(int val){...}
的东西,你需要将“foo”的名称和它的参数类型传递到我们想象的模板中。虽然传递val
的类型不是问题,但传递“foo”的名称是不可能的。您可以使用的唯一非类型模板参数是:
您还应该注意,引用和指针类型的非类型模板参数有一些例外,即它们不能引用或是字符串文字的地址(相关:this question)。考虑到上述情况,无法将字符串文字传递给模板,因此无法通过模板实现所需。
另一方面,虽然可变参数模板是该语言的一个很好的补充,但它们有一些限制,即您只能执行参数包的扩展,但是您无法解决包中的各个参数。 / p>
所以,总而言之,不,模板不可能实现你想要的东西。
答案 1 :(得分:1)
不幸的是没有。模板机制只允许您使用类型泛型,即创建可以使用多种类型的函数/对象,或者对不同的输入类型具有稍微不同的实现,或者使返回类型依赖于模板参数等。通常,模板元编程引入了所谓的静态多态。这是compiler
阶段的功能(查看compilation stages),这意味着在所有名称都修复后完成(即使编译器决定使用它,函数foo()
也将始终称为foo
带有int
参数。)
您要实现的目标是进入proprocessor
阶段,其中可以使用preprocessor directives修改源代码。这是你可以玩宏的时刻。对于您的示例,您可以使用以下内容:
#include <iostream>
using namespace std;
#define MySmartTemplate(StructName, Func1Name, Func1ArgType, Func2Name, Func2ArgType) \
struct StructName \
{ \
void Func1Name(Func1ArgType val) { cout << "func1" << endl; } \
void Func2Name(Func2ArgType val) { cout << "func2" << endl; } \
};
MySmartTemplate(MyStruct, foo, int, bar, double);
int main()
{
MyStruct myStruct;
myStruct.foo(1);
myStruct.bar(1);
}
当然,您可以使用带有模板的宏,这样可以提供更大的灵活性。