结构成员上的模板函数

Template function on struct members

本文关键字:函数 成员 结构      更新时间:2023-10-16

有没有办法编写能够在给定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;
}

我想象了一个基于开关的答案,但随后我想知道这个开关是否会在运行时(我想避免(或编译时进行测试?

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

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;
}

看到它在魔杖盒上启动并运行;

您可以利用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也适用于数据成员。 创建一个可调用对象,该对象返回对随后可以使用的值的引用:int x = mem_fn(&pair<int,char>::first)(my_pair);