2015-10-13 65 views
2

我开始用C++ 11可变参数模板,我不知道,如果它可以创建一个结构/类的方法,从一个模板参数得名C++通用模板方法名

喜欢的东西:

MySmartTemplate<"foo", int, "bar", double> MyStruct; 

// which should result in: 
struct MyStruct 
{ 
    void foo(int val){...} 
    void bar(double val){...} 
}; 

在模板参数可能来配对作为<名> + <型>

感谢

+1

不,但可以使用预处理器宏。 – CoffeeandCode

+3

简而言之,答案是否定的,这是不可能的,反正不是。 –

回答

2

模板根本不可能。 C++中的模板通过一个或多个模板参数列表进行参数化。它们中的每一个可以是:

  • 非类型模板参数;
  • 一个类型模板参数;
  • 模板模板参数。

现在,为了能够(理论上)建立类似void foo(int val){...},你需要通过“富”的名字和它的参数类型到我们想象的模板。虽然传递val类型不成问题,但传递“foo”的名字是不可能的。您可以使用的唯一非模板参数是:

  • std :: nullptr_t;
  • 整型;
  • 左值引用类型(对象或函数);
  • 指针类型(对象或函数);
  • 指向成员类型(指向成员对象或成员函数)的指针;
  • 枚举类型。

你还应该注意,参考和指针类型的非类型模板参数有少数例外,即它们不能引用或者是一个字符串的地址(相关:this question)。考虑到上述情况,无法将字符串文字传递给模板,因此无法通过模板实现您想要的内容。

另一方面,虽然可变参数模板是语言的一个很好的补充,但它们有一些限制,即只能执行参数包的扩展,但不能解决包中的各个参数。

因此,总结,不,你想要的是模板不可能的。

+0

...好的,那不太好。如果函数“名称”将被索引替换,如元组< ... > get(i)? –

+0

@xy,以及你可以在地图中存储函数指针,并通过作为模板参数传递的索引从那里获取它们,但是我看不出为什么你需要为此使用模板。 – SingerOfTheFall

+0

除了添加/删除一些模板参数 - 它是关于排序。假设模板参数的顺序很重要,所以参数包中第一个的顺序与其他顺序不同... –

1

不幸的是没有。模板机制只允许您使用类型的通用性,也就是创建可以使用多种类型的函数/对象,或者针对不同的输入类型具有稍微不同的实现,或者根据模板参数等形成返回类型。通常,模板元编程引入了所谓的静态多态性。这是一个compiler阶段的功能(检出compilation stages),这意味着它是在所有名称都固定后完成的(即使编译器决定将其与int参数一起使用,功能foo()也将始终被调用为foo)。

你试图实现的是进入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); 
} 

Live demo


当然,你可以使用宏与模板,这将让您有更多的灵活性。

+0

“模板机制只允许您在类型通用性方面获得乐趣,即创建函数/对象可以使用多种**类型**“。所以如果我将不同的_function指针作为模板参数传递,它会 - 很好地 - 模拟我的想法...,我会看看,但谢谢澄清... –