[英]C++ Templates - Different Specialization for Floating and Integral types
我正在嘗試用這樣的簽名編寫一個函數:
template<typename From, typename To>
To bar(From in){...}
此函數需要具有不同的行為,具體取決於To
是浮點類型還是整數類型。 (假設From
是積分且都是算術的)
這可以使用if constexpr(std::is_integral<To>::value) {...} else {...}
輕松實現,但是我僅限於C ++ 11,如果沒有if constexpr
。
實現這種專業化的好方法是什么?
您可以使用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) {
...
}
BTW我建議更改模板參數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.");
}
如果您確定To
類型是整數或浮點數,另一種可能的解決方案是使用標記調度
使用std::is_integral<T>
從std::true_type
繼承的std::true_type
,當T
是整數類型時,或者從std::false_type
,否則,你可以寫bar()
(也使用From
/ To
命令改變建議由songyuanyao)如下
template <typename To, typename From>
To bar (From inVal)
{ return foo<To>(inVal, std::is_integral<To>{}); }
並開發兩個具有不同簽名的foo()
模板函數(第二個參數的std::true_type
或std::false_type
)如下
template <typename To, typename From>
To foo (From inVal, std::true_type const &)
{ std::cout << "foo() integral case: " << inVal << std::endl; return {0}; }
template <typename To, typename From>
To foo (From inVal, std::false_type const &)
{ std::cout << "foo() float case: " << inVal << std::endl; return {1}; }
現在,打電話
bar<int>("abc");
bar<double>("xyz");
你得到
foo() integral case: abc
foo() float case: xyz
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.