C++函数模板限制参数类型

c++ function template restrict parameter type

鉴于 class

class foo {  
  public:  
    void func(std::string s){};  
    void func(int i){};  
    void func2(std::string s){};  
    void func2(int i){};  
 };  

我想通过使用模板函数来摆脱多重函数重载。但是,函数应该只接受 int 或 std::string.

我看到了如何使用 c++20 中的概念来实现这一点。但是,我无法访问支持概念的编译器。

在 c++17 中实现这样的目标的方法是什么?我希望能够使用某种形式的 std::enable_if 或类似形式在模板规范中完成,而不是使用 static_assert.

下面的答案表明这是可以做到的。有没有办法只定义一次 'template' 定义?

    class foo {  
      template <typename arg_t,   
        std::enable_if_t<std::is_same_v<std::decay_t<arg_t>, int> || std::is_same_v<std::decay_t<arg_t>, std::string>, boo> = true>  
      void func(arg_t arg){}  
      template <typename arg_t,   
        std::enable_if_t<std::is_same_v<std::decay_t<arg_t>, int> || std::is_same_v<std::decay_t<arg_t>, std::string>, boo> = true>  
      void func2(arg_t arg){}
    };
    ```

使用enable_if你可以写这样的函数

template <typename arg_t, std::enable_if_t<std::is_same_v<std::decay_t<arg_t>, int> ||
                                           std::is_same_v<std::decay_t<arg_t>, std::string>,
                                           bool> = true>
void func(arg_t arg){}