簡體   English   中英

C ++模板 - 浮點和積分類型的不同專業化

[英]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我建議更改模板參數FromTo的聲明順序,然后你可以在調用時明確指定第一個模板參數。 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_typestd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM