如何模板化变量NAMES,而不是类型?

Teb*_*bas 13 c++ templates

我的问题是关于如何模板化应该使用的类成员的名称.

也许是一个简化的伪示例:

/** 
Does something with a specified member of every element in a List.
*/
template<membername MEMBER> // <-- How to define such thing?
void doSomething(std::vector<MyClass> all){

    for( i=0; i < all.size(); i++)
      all[i].MEMBER++; // e.g.; use all[i].MEMBER in same way

}
Run Code Online (Sandbox Code Playgroud)

class MyClass{
public:
    int aaa, bbb, ccc;
}
Run Code Online (Sandbox Code Playgroud)

和申请:

main(){
    vector<MyClass> all = ....

    // applicate doSomething() to all aaa's
    doSomething<aaa>(all);  // or:
    doSomething<MyClass::aaa>(all); // or:
    doSomething<?????>(all);
}
Run Code Online (Sandbox Code Playgroud)

模板定义应该如何,我可以在doSomething(.)中切换访问/修改MyClass的哪个成员变量(aaa,bbb或ccc)?
在我的真实世界任务中,所有成员都是相同的类型,如上所述.

谢谢,Tebas

sel*_*tze 19

模板参数仅限于类型,整数常量,函数的指针/引用或具有外部链接和成员指针的对象- 但没有标识符.

但您可以使用成员指针作为模板参数:

template<int MyClass::* MemPtr>
void doSomething(std::vector<MyClass> & all) {
   for( i=0; i < all.size(); i++)
      (all[i].*MemPtr)++;
}

:

doSomething<&MyClass::aaa>(all);
Run Code Online (Sandbox Code Playgroud)

请注意,我更改了doSomething函数以获取引用,而不是按值接受向量.


Arm*_*yan 10

sellibitze的解决方案很好(虽然老实说不是很好:看看我的编辑),只是它限制你只使用int类型的成员.一个更通用的解决方案是这个(尽管这里的成员不是模板参数)

#include <vector>

struct MyClass
{
   int i;
   char c;
};

template <class T>
void DoSomething(std::vector<MyClass>& all, T MyClass::* MemPtr)
{ 
   for(std::vector<MyClass>::size_type i = 0; i < all.size(); ++i)
      (all[i].*MemPtr)++;
}

int main()
{
   std::vector<MyClass> all;
   DoSomething(all, &MyClass::i);
   DoSomething(all, &MyClass::c);
}
Run Code Online (Sandbox Code Playgroud)

编辑:另请注意,指向成员的指针通常不是一个好主意,因为只有那些已知编译时的指针才能被传递,也就是说你无法确定指针运行时然后将其作为模板参数传递.