用于数字类型的c++模板
C++ template for numeric types
我想有一个模板来选择数字类型,但我也想有一个全局类型模板太。我试着用这个方法解决这个问题,但是没有用:
template<typename T, typename ... Types>
void myFct(T arg1, Types ... rest) { /*do stuff*/ }
template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type,
typename ... Types>
void myFct(T arg1, Types ... rest) { /* do stuff */ }
,因为现在我有两个具有相同头文件的函数。正确的做法是:
template<typename T, typename ... Types>
void myFct(T arg1, Types ... rest)
{
if (isNumeric(T))
doNumericStuff();
else
doStuff();
}
可能有更好的方法来做到这一点,但对我来说最简单的方法是将enable_if
粘贴到返回类型上:
template<typename T, typename ... Types>
typename std::enable_if<
std::is_arithmetic<T>::value
>::type
myFct(T arg1, Types ... rest) { /*do numeric stuff*/ }
template<typename T, typename ... Types>
typename std::enable_if<
!std::is_arithmetic<T>::value
>::type
myFct(T arg1, Types ... rest) { /*do non-numeric stuff*/ }
一旦你有两个以上互斥的选项,这将变得非常笨拙,但这绝对是可行的。
您可以在这里使用标签调度,并重载实现函数,因为您的"do stuff"似乎一次只关注一个对象。
template <typename T>
void do_stuff(T arg, std::true_type) {
std::cout << "numbern";
}
template <typename T>
void do_stuff(T arg, std::false_type) {
std::cout << "not-numbern";
}
void myFct() { }
template<typename T, typename... Ts>
void myFct(T arg1, Ts... rest) {
// is_arithmetic will derive either true_type or false_type
do_stuff(arg1, std::is_arithmetic<T>{});
myFct(rest...); // recurse
}
这是获得类似"static if"的典型模式
如果我用myFct(1, std::string{}, 2.0);
调用它,我得到输出
number
not-number
number
相关文章:
- .cpp和.h文件中的模板专用化声明
- C++模板来检查友元函数的存在
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 如何在c++中为模板函数实例创建快捷方式
- 使用C++中的模板和运算符重载执行矩阵运算
- 有人能分解一下这个c++模板的语法吗
- 如何在c++17中制作一个模板包装器/装饰器
- 模板化建造师专业化
- 调用专用模板时出错"no matching function for call to [...]"
- 模板元程序查找相似的连续类型名称
- 如何在C++20中创建模板别名的推导指南
- 没有名称的C++模板参数
- 具有重复类型的C++可变模板
- 如何将enable-if与模板参数和参数包一起使用
- 没有用于初始化C++中的变量模板的匹配构造函数