来自模板参数的C ++通用模板方法名称

时间:2015-10-13 09:38:37

标签: c++ templates c++11

我从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;

由于

2 个答案:

答案 0 :(得分:2)

根本不可能使用模板。 c ++中的模板由一个或多个模板参数的列表参数化。他们每个人可能是:

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

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

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

您还应该注意,引用和指针类型的非类型模板参数有一些例外,即它们不能引用或是字符串文字的地址(相关: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);
}

Live demo

当然,您可以使用带有模板的宏,这样可以提供更大的灵活性。