如何用条件调用两个c++模板函数之一



有两个成员模板函数:fun1(), fun2()。我想调用一个由const bool类成员决定的函数:willCallFun1。代码中有一个类似fun()的解决方案,但是if-else分支将在fun()被调用时每次检查一次。我要避开分支。由于在构造Foo对象时,已经设置了const bool willCallFun1,因此可以确定将使用fun1和fun2的哪个函数。

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

如果fun1、fun2是非模板函数,则可以在类中添加一个新成员,例如函数指针或std::函数,以便在构造函数中绑定其中一个。当它们是模板函数时,我找不到这样做的方法。如果有人能回答我,我将非常感激。

既然你不能让willCallFun1成为模板参数,并使用if constexpr来决定调用哪个函数,你可以创建一个成员函数指针数组,并使用willCallFun1作为索引变量查找正确的一个。

template <typename T>
void fun(T t) {
using fun_sig = void(Foo::*)(T);
static constexpr fun_sig funs[] = {&Foo::fun2<T>, &Foo::fun1<T>};
(this->*funs[willCallFun1])(t);
}

演示我测试如果这实际上比有一个简单的if更快。我以前这样做过,结果令人失望。

最新更新