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

qv7cva1a  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(134)

有一个类具有两个成员模板函数: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,在构造函数中绑定其中一个,如果是模板函数,我就找不到办法了,如果有人能回答,我会非常感激。

kkbh8khc

kkbh8khc1#

由于不能将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);
}

Demo
我想测试一下这是否真的比使用一个简单的if快,我以前做过,结果令人失望。

相关问题