【发布时间】:2017-06-16 09:19:27
【问题描述】:
使用 C++11 的 enable_if 我想为一个函数定义几个专门的实现(例如,基于参数的类型)以及一个默认实现。正确的定义方式是什么?
以下示例无法按预期工作,因为调用了“通用”实现,无论T 是什么类型。
#include <iostream>
template<typename T, typename Enable = void>
void dummy(T t)
{
std::cout << "Generic: " << t << std::endl;
}
template<typename T, typename std::enable_if<std::is_integral<T>::value>::type>
void dummy(T t)
{
std::cout << "Integral: " << t << std::endl;
}
template<typename T, typename std::enable_if<std::is_floating_point<T>::value>::type>
void dummy(T t)
{
std::cout << "Floating point: " << t << std::endl;
}
int main() {
dummy(5); // Print "Generic: 5"
dummy(5.); // Print "Generic: 5"
}
在我的最小示例中,一个解决方案是明确声明“通用”实现不适用于整数或浮点类型,使用
std::enable_if<!std::is_integral<T>::value && !std::is_floating_point<T>::value>::type
这正是我想要避免的,因为在我的实际用例中有很多专门的实现,我想避免默认实现的时间很长(容易出错!)。
【问题讨论】:
标签: c++ c++11 sfinae enable-if