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){}
鉴于 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){}