我正在尝试编写一个带有如下签名的函数:
template<typename From, typename To>
To bar(From in){...}
这个函数需要有不同的行为取决于 if To
是 float 型还是积分型。 (假设From
是整数且都是算术)
这可以使用 if constexpr(std::is_integral<To>::value) {...} else {...}
轻松实现,但是我仅限于没有 if constexpr
的 C++11 .
实现这种特化的好方法是什么?
最佳答案
您可以将模板重载与 SFINAE 一起使用.例如
template<typename To, typename From>
typename std::enable_if<std::is_integral<To>::value, To>::type bar(From in) {
...
}
template<typename To, typename From>
typename std::enable_if<std::is_floating_point<To>::value, To>::type bar(From in) {
...
}
顺便说一句,我建议更改模板参数的声明顺序 From
和 To
,那么您可以在调用它们时明确指定第一个模板参数。如bar<int>(...);
和 bar<float>(...);
.
如果您想获得除整型和浮点类型之外的更清晰的消息,您可以添加另一个重载。例如
template<class T> struct dependent_false : std::false_type {};
template<typename To, typename From>
typename std::enable_if<!std::is_integral<To>::value && !std::is_floating_point<To>::value, To>::type bar(From in) {
static_assert(dependent_false<To>::value, "Types must be integral or floating point types.");
}
关于C++ 模板 - 浮点型和整型的不同特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50196026/