2017-08-08 5 views
0

は、次のコードを考えてみましょう:等しいテンプレートパラメータタイプの関数を特化/オーバーロードする方法は?

class Helper { 
public: 
    template<typename taResult, typename taParam> static taResult Cast(const taParam par); 
}; 
template<> inline __m256d Helper ::Cast(const __m256i par) { 
    return _mm256_castsi256_pd(par); 
} 
template<> inline __m256i Helper ::Cast(const __m256d par) { 
    return _mm256_castpd_si256(par); 
} 

私は、パラメータや戻り値の型は等号あるキャストを処理するためにHelper機能に追加したいです。これまでの私の専門化/過負荷の試みは、異なるコンパイルエラーで失敗しました。

クラスのボディに、次のような何か:

template<typename T> static T Cast(const T par) { 
    return par; 
} 
+1

ここにコピーされたときに、あなたのコードがそのテンプレート引数の一部を失ったように見えます。それが正しいことを確認できますか? –

+0

@DanielH:OPは専門化を使用しました。 – Jarod42

+0

ここで通常の過負荷を使用しないでください。 3つのオーバーロードを提供します:1つは__m256i、1つは__m256d、もう1つは通常のテンプレートです。 –

答えて

3

関数を部分的に特殊化することはできません。オーバーロードはあいまいです。

template <typename To, typename From> struct CastImpl; 

template <typename T> struct CastImpl<T, T> 
{ 
    T operator()(T t) const { return t; } 
}; 

template <> struct CastImpl<__m256d, __m256i> 
{ 
    __m256d operator()(__m256i t) const { return _mm256_castsi256_pd(t); } 
}; 

template <> struct CastImpl<__m256i, __m256d> 
{ 
    __m256i operator()(__m256d t) const { return _mm256_castpd_si256(t); } 
}; 

、その後

class Helper { 
public: 
    template<typename taResult, typename taParam> 
    static taResult Cast(const taParam par) 
    { 
     return CastImpl<taResult, taParam>{}(par); 
    } 
}; 
+0

機能の一部を特殊化できないのはなぜですか? –

+2

@DanielH [関数のオーバーロードで混乱](http://www.gotw.ca/publications/mill17.htm)。 –

+0

OPは彼の機能を完全に特殊化しました。 – Jarod42

1

ありませんあなたがすることはできませんに、それは部分的に許可されていない機能を、特化しようとする試みになるので。代わりに、特殊化することができない中間のテンプレートクラスを使用する必要があります。

私は必要に応じて例を挙げることができます。

1

あなたはHelper::Castを実装するためのヘルパークラス/構造体のテンプレートを使用することができます。

あなたはあなたがが、部分的特化することができますクラスを追加することができます。

ここには、概念を示すためにいくつかのショートカットを使用した簡単なプログラムがあります。

using __m256d = double; 
using __m256i = int; 

template<typename taResult, typename taParam> struct RealHelper; 

class Helper 
{ 
    public: 
     template<typename taResult, typename taParam> static taResult Cast(const taParam par) 
     { 
     return RealHelper<taResult, taParam>::doit(par); 
     } 

    private: 

}; 

template <> struct RealHelper<__m256d, __m256i> 
{ 
    inline static __m256d doit(const __m256i par) 
    { 
     // return _mm256_castsi256_pd(par); 
     return par; 
    } 
}; 

template <> struct RealHelper<__m256i, __m256d> 
{ 
    inline static __m256i doit(const __m256d par) 
    { 
     // return _mm256_castpd_si256(par); 
     return par; 
    } 
}; 

template <typename T> struct RealHelper<T, T> 
{ 
    inline static T doit(const T par) 
    { 
     return par; 
    } 
}; 

int main() 
{ 
    auto v1 = Helper::Cast<int, double>(10); 
    auto v2 = Helper::Cast<double, int>(20); 
    auto v3 = Helper::Cast<int, int>(30); 
    auto v4 = Helper::Cast<double, double>(40); 
} 
0

私はヘルパーにパラメータと戻り値の型は等号あるキャストを処理するための機能を追加したいです。

std::is_same<taResult, taParam>::valueの値に応じてCast()バージョンを有効/無効にするにはどうすればよいですか?

簡略化した例

#include <iostream> 
#include <type_traits> 

struct Helper 
{ 
    template <typename taR, typename taP> 
    static std::enable_if_t<false == std::is_same<taR, taP>::value, taR> 
     Cast (taP const & par) 
    { std::cout << "different Cast" << std::endl; return {}; } 

    template <typename taR, typename taP> 
    static std::enable_if_t<true == std::is_same<taR, taP>::value, taR> 
     Cast (taP const & par) 
    { std::cout << "equal Cast" << std::endl; return par; } 
}; 

template <> 
int Helper::Cast<int, long> (long const & par) 
{ std::cout << "int/long Cast" << std::endl; return {}; } 

template <> 
long Helper::Cast<long, int> (int const & par) 
{ std::cout << "long/int Cast" << std::endl; return {}; } 

int main() 
{ 
    Helper::template Cast<int>(0);  // print "equal Cast" 
    Helper::template Cast<int>(0L);  // print "int/log Cast" 
    Helper::template Cast<long>(0);  // print "long/int Cast" 
    Helper::template Cast<long>("foo"); // print "different Cast" 
} 
+0

これは、私が問題のコード例で '__m256d'や' __m256i'のような特定の型に対して 'Cast()'を特化してみてください。 –

+0

@SergeRogatch - いくつかの特殊化された例 – max66

関連する問題