有一个类具有两个成员模板函数:fun 1(),fun 2().我想调用一个由const bool类成员决定的函数:willCallFun 1,代码中有类似fun()的解决方案,但每次调用fun()时if-else分支都会检查,我希望避免分支,因为构造Foo对象时已经设置了const bool willCallFun 1,所以已经可以确定使用fun 1和fun 2中的哪一个函数。
class Foo {
public:
const bool willCallFun1;
Foo(bool b) : willCallFun1{b}{
}
template<typename T>
void fun1(T t) {
std::cout << "fun1 "<< t << "\n";
}
template<typename T>
void fun2(T t) {
std::cout << "fun2 "<< t << "\n";
}
template<typename T>
void fun(T t){
if (willCallFun1) fun1<T>(t);
else fun2<T>(t);
}
};
int main() {
Foo f1{true};
f1.fun(123);
f1.fun("hi");
Foo f2{false};
f2.fun(456);
f2.fun("hello");
}
如果fun 1、fun 2是非模板函数,我可以在类中添加一个新成员,比如函数指针或者std::function,在构造函数中绑定其中一个,如果是模板函数,我就找不到办法了,如果有人能回答,我会非常感激。
1条答案
按热度按时间kkbh8khc1#
由于不能将
willCallFun1
设置为模板参数并使用if constexpr
来决定调用哪个函数,因此可以创建一个成员函数指针数组,并使用willCallFun1
作为索引变量来查找正确的指针。Demo
我想测试一下这是否真的比使用一个简单的
if
快,我以前做过,结果令人失望。