仅当函数支持传递的适当可变参数时才进行编译


#include <iostream>
#include <utility>
class A 
{
  public:
  void run(int value)
  {
      std::cout << value << std::endl;
  }
};
class B 
{
  public:
  void run(int value1, int value2)
  {
      std::cout << value1 << " "
                << value2 
                << std::endl;
  }
};

template<typename T,
          typename ... Args>
void call_run(T& t, Args&& ... args)
{
    // scope below should compile only
    // if T has a run function and 
    // this run function has a signature 
    // matching Args
    // (empty score otherwise)
    {
        t.run(std::forward<Args>(args)...);
    }
}

int main()
{
    int value = 1;
    A a;
    call_run(a,value);
    // compilation error if uncommented
    //B b;
    //call_run(b,value);
    return 0;
}

上面的代码编译并运行良好。但是,如果使用B实例调用call_run的最新部分被取消注释,那么代码就无法编译,原因很明显:

main.cpp:34:9: error: no matching function for call to ‘B::run(int&)’
     t.run(std::forward<Args>(args)...);

是否可以忽略不适用的范围进行编译?(此处忽略,意思是在编译时用空作用域替换有缺陷的作用域(

由于c++17,您可以使用if constexpr:

if constexpr (std::is_invocable_v<decltype(&T::run),T*,Args...>)
{
    t.run(std::forward<Args>(args)...);
}

编译时检查可调用性,如果返回false,则忽略if作用域的主体。

现场演示

相关内容

  • 没有找到相关文章

最新更新