簡體   English   中英

不同類型模板專業化的最佳方式

[英]Best way of template specializations for different types

在查看庫、stackoverflow 問題和網絡上的文章時,事實證明在 C++11 中有兩種主要方法可以為不同類型創建相同功能的模板特化(如果需要,部分):

帶有 SFINAE 返回類型的函數模板

#include <type_traits>

namespace detail
{    
    template <class T>
    typename std::enable_if<std::is_integral<T>::value, T>::type
    compute_thing(T n)
    {
        // do calculations and return something
    }

    template <class T>
    typename std::enable_if<std::is_floating_point<T>::value, T>::type
    compute_thing(T n)
    {
        // do calculations and return something
    }
}

template <class T>
T compute_thing(T n)
{
    return detail::compute_thing<T>(n);
}

具有 SFINAE 部分特化的結構/類模板

#include <type_traits>

namespace detail
{    
    template <class T, class Enable = void>
    struct compute_thing;

    template <class T>
    struct compute_thing<T, typename std::enable_if<std::is_integral<T>::value, T>::type>
    {
        static T call(T x)
        {
            // do calculations and return something
        }
    };

    template <class T>
    struct compute_thing<T, typename std::enable_if<std::is_floating_point<T>::value, T>::type>
    {
        static T call(T x)
        {
            // do calculations and return something
        }
    };
}

template <class T>
T compute_thing(T n)
{
    return detail::compute_thing<T>::call(n);
}

不過還不清楚:

  • 應該首選哪種風格,為什么?
  • 在可重用性、多功能性、編譯時和運行時性能方面有哪些優點/缺點?

如果結果需要一些處理或返回一個非常量值,我會使用這個解決方案,使用函數:

template <class T>
typename std::enable_if<std::is_integral<T>::value, T>::type compute_thing(T n)
{
    return some_integral_calc(n);
}

template <class T>
typename std::enable_if<std::is_floating_point<T>::value, T>::type compute_thing(T n)
{
    return some_fp_calc(n);
}

但是如果我能讓編譯器完成獲取我的 const 值的工作(例如通過 constexpr。)我會盡可能使用專門的結構。

https://en.wikipedia.org/wiki/Template_metaprogramming#Compile-time_class_generation

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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