C++ 模板 - 浮点型和整型的不同特化

标签 c++ c++11 templates template-specialization

我正在尝试编写一个带有如下签名的函数:

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) {
    ...
}

顺便说一句,我建议更改模板参数的声明顺序 FromTo ,那么您可以在调用它们时明确指定第一个模板参数。如bar<int>(...);bar<float>(...); .

LIVE

如果您想获得除整型和浮点类型之外的更清晰的消息,您可以添加另一个重载。例如

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/

相关文章:

c++ - 指向成员变量的指针

c++ - std::function 复制参数?

C++如何将函数应用于 vector 元素

c++ - 如何解决 std::function 没有 operator== 的事实?

javascript - 在我的 jade 模板中添加导航栏

c++ - 如何在多线程中使用模板类型作为槽和信号参数?

C++ Eclipse 控制台将纯文本编码为其他字符

c++ - 更智能的智能指针

c++ - iconv() - 如何确定输出缓冲区所需的大小?

c++ - unique_ptr 参数。错误 C2664