val*_*ien 6 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;
}
Run Code Online (Sandbox Code Playgroud)
我想象一个基于交换机的答案,但我想知道这个交换机是否会在运行时(我想避免)或编译时进行测试?
sky*_*ack 11
只要您想从一组具有相同类型的数据成员中获取数据成员,就可以使用指向数据成员的指针:
template <int Foo::*M>
void cout_member(Foo foo)
{
std::cout << (foo.*M) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
并将其用作:
cout_member<&Foo::a>(foo);
Run Code Online (Sandbox Code Playgroud)
如果您还要指明类型,可以执行以下操作:
template <typename T, T Foo::*M>
void cout_member(Foo foo)
{
std::cout << (foo.*M) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
并将其用作:
cout_member<int, &Foo::a>(foo);
Run Code Online (Sandbox Code Playgroud)
出于好奇,第二个片段在C++ 17中会更简单:
template <auto M>
void cout_member(Foo foo)
{
std::cout << (foo.*M) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
在wandbox上查看并运行;