指向成员变量的引用/指针作为模板形参
C++: Reference/pointer to member variable as template parameter
首先,我有这样的东西:
class Test {
std::vector<int> a, b;
void caller(...) { callee(...); }
void callee(...) { /* Do stuff with 'a' */ }
}
我想要的是一个与callee
完全相同的函数但是对于向量b
。要做到这一点,有两个明显的解决方案:
- 传递矢量
a
或b
作为参数。然而,callee
是一个可以进行数百次调用的递归函数,将向量作为参数传递只是不必要的开销。 - 复制函数
callee
并使用矢量b
,这将是最好的选择,尽管callee
是一个相当长的函数,我会有很多重复的代码。
出于好奇,我去找模板部分,我注意到可以用于
左值引用类型
指针类型指向成员类型 的指针
所以我试着这样做:
class Test {
std::vector<int> a, b;
void caller(...) { callee<a>(...); }
template <std::vector<int> &x> void callee(...) { /* Do stuff with 'x' */ }
}
但是我得到
错误:在常量表达式
中使用' this '
是否有任何方法来实现这一点,无论是引用或指针?
顺便说一下,我想要的可以看作是一个函数作用域的#define
数组甚至元组,但不喜欢老式的指向成员的指针?
class Test {
std::vector<int> a, b;
void caller(/*...*/) { callee<&Test::a>(/*...*/); }
template <std::vector<int> Test::*vec>
void callee(/*...*/) { /* Do stuff with `(this->*vec)` */ }
};
不能使用对数据成员的引用作为模板参数:模板是编译时的,this
的值直到运行时才知道。换句话说,对于类型为Test
的每个运行时对象,您需要一个单独的实例化(单独的二进制代码)。
可以做的是将a
和b
替换为一个数组,并通过索引将callee
模板化为这个数组:
class Test {
std::array<std::vector<int>, 2> ab;
void caller(...) { callee<0>(...); }
template <size_t idx>
void callee(...) { /* Do stuff with 'ab[idx]' */ }
}
这样,您只获得callee
的两个实例化(一个用于0
,一个用于1
),索引在编译时完成(或至少是可行的)。
直接使用facade:
class Test {
std::vector<int> a, b;
void caller_a(...) { callee(a); }
void caller_b(...) { callee(b); }
void callee(std::vector<int> &a_or_b, ...) {
}
}
callee()
将引用它的形参,该形参将作为一个或另一个类成员传入。
与@Angew的回答相同,您也可以使用std::tuple,这很有趣,因为使用tuple您还可以在被调用函数中使用不同类型的容器:
class Test {
std::tuple<std::vector<int>, std::list<int> > ab;
void caller(...) { callee<0>(...); }
template <size_t idx>
void callee(...) {
...
auto aIt = std::get<idx>(ab).begin(); // gets either the vector or the list depending on template value
...
}
}
相关文章:
- 哪个模板形参在boost::shared_ptr构造函数中使用一个原始指针
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- c++中作为形参的指针
- 指向函数的指针vs作为模板非类型形参的函数
- 指向成员变量的引用/指针作为模板形参
- 用带有特定(double..)指针形参的void*函数重载函数
- 为什么模板非类型形参指针和引用实参需要是全局的
- c++形参是一个指向常量对象的指针,但不返回更新后的对象
- 函数指针的vector:不同的模板形参
- 重载在形参中接受指针的操作符
- 关于将指向数组的指针作为函数形参的混淆
- 为什么c++ 11 CAS操作使用两个指针形参
- 在c++中向指针形参传递值
- 将指向类成员的指针作为模板形参传递
- 具有指针引用模板形参的c++模板成员函数
- 在模板演绎中保持函数指针形参的完整类型
- 模板化形参的函数指针歧义
- 指向函数形参的指针vs函数形参
- 指向类成员作为模板形参的指针
- 函数指针的形参类型的模板实参演绎涉及未演绎的形参包