我的问题是关于如何模板化应该使用的类成员的名称.
也许是一个简化的伪示例:
/**
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)
编辑:另请注意,指向成员的指针通常不是一个好主意,因为只有那些已知编译时的指针才能被传递,也就是说你无法确定指针运行时然后将其作为模板参数传递.
归档时间: |
|
查看次数: |
7326 次 |
最近记录: |