struct成员的模板函数

时间:2017-08-14 15:48:46

标签: c++ templates struct switch-statement

有没有办法对能够在给定struct的不同成员上运行的单个模板函数进行编码?

错误的示例如下所示:

struct Foo
{
  int a, b;
}

template <MEMBER x> //which does not exist 
cout_member(Foo foo)
{
  cout << foo.x << endl;
}

int main()
{
  Foo foo; 
  cout_member<a>(foo);
  cout_member<b>(foo);
  return 0;
}

我想象一个基于交换机的答案,但我想知道这个交换机是否会在运行时(我想避免)或编译时进行测试?

2 个答案:

答案 0 :(得分:11)

只要您想从一组具有相同类型的数据成员中获取数据成员,就可以使用指向数据成员的指针:

template <int Foo::*M>
void cout_member(Foo foo)
{
    std::cout << (foo.*M) << std::endl;
}

并将其用作:

cout_member<&Foo::a>(foo);

如果您还要指明类型,可以执行以下操作:

template <typename T, T Foo::*M>
void cout_member(Foo foo)
{
    std::cout << (foo.*M) << std::endl;
}

并将其用作:

cout_member<int, &Foo::a>(foo);

出于好奇,第二个片段在C ++ 17中会更简单:

template <auto M>
void cout_member(Foo foo)
{
    std::cout << (foo.*M) << std::endl;
}

wandbox;

上查看并运行

答案 1 :(得分:1)

您可以利用std::mem_fn,因此您甚至不必关心:(未经测试)

template < typename Fun, typename ... Params >
void print(Fun f, Params && ... p) { std::cout << f(std::forward<Params>(p)...) << "\n"; }

print(std::mem_fn(&Obj::fun), Obj());

由于你正在使用流,你可能并不在乎......但是这只会在写cout << obj.fun()时增加很少的零开销。

编辑:mem_fn也适用于数据成员。创建一个callable,返回对您可以使用的值的引用:int x = mem_fn(&pair<int,char>::first)(my_pair);