2012-01-14 12 views
6

basic POD(私は基本的なPODは特にそういうわけではありませんが、私はそれを取ることにします)に1つの特殊化を適用できるように、テンプレートの特殊化の微妙なトリックがあります。基本的なPODのテンプレートの特殊化

template<typename T> 
struct DoStuff 
{ 
    void operator()() { std::cout << "Generic\n";} 
}; 
template<> 
struct DoStuff</*SOme Magic*/> 
{ 
    void operator()() { std::cout << "POD Type\n";} 
}; 

また、組み込みの種類ごとに特殊化を記述する必要がありますか?

template<typename T> 
struct DoStuff 
{ 
    void operator()() { std::cout << "Generic\n";} 
}; 


// Repeat the following template for each of 
// unsigned long long, unsigned long, unsigned int, unsigned short, unsigned char 
//   long long,   long,   int,   short, signed char 
// long double, double, float, bool 
// Did I forget anything? 
// 
// Is char covered by unsigned/signed char or do I need a specialization for that? 
template<> 
struct DoStuff<int> 
{ 
    void operator()() { std::cout << "POD Type\n";} 
}; 

ユニットテスト。

int main() 
{ 
    DoStuff<int>   intStuff; 
    intStuff();   // Print POD Type 


    DoStuff<std::string> strStuff; 
    strStuff();   // Print Generic 
} 
+0

私は好奇心が強いです - 実装がまだPODタイプのために別のことをしていないということを "もの"したいと思っているのですか? –

+0

私はboost :: mplを使用しています。クラスのようなオブジェクトの場合は、クラスオブジェクトを操作するアクションを登録する必要があります(そして、すべてのメンバーのアクションを登録してください)。通常のPODオブジェクトでは、オブジェクトに対してアクションを実行するために登録されるはるかに単純なアクションがあります。 –

答えて

6

PODの種類は、次のように動作するはずです:

#include <iostream> 
#include <boost/type_traits/integral_constant.hpp> 
#include <boost/type_traits/is_fundamental.hpp> 
#include <boost/type_traits/is_same.hpp> 

template<typename T> 
struct non_void_fundamental : boost::integral_constant< 
    bool, 
    boost::is_fundamental<T>::value && !boost::is_same<T, void>::value 
> 
{ }; 

template<typename T, bool Enable = non_void_fundamental<T>::value> 
struct DoStuff 
{ 
    void operator()() { std::cout << "Generic\n"; } const 
}; 

template<> 
struct DoStuff<T, true> 
{ 
    void operator()() { std::cout << "POD Type\n"; } const 
}; 

あなたはまた、ユーザー定義のPODタイプは、その後、boost::is_pod<>代わりのnon_void_fundamental<>(あなたがC++ 11を使用し、最適化の目的のためにこれをやっている場合は、使用を使用したい場合代わりにstd::is_trivially_copyable<>)。

1

ブーストがboost::is_podである。それはあなたが探しているものですか?あなたが本当に唯一の基本型ではなく、ユーザー定義をしたい場合は

(私はそれを使ったことがないので、私はあなたがあなたの例に必要な正確なコードを策定しようとすることで自分自身を困らなくなります。)

+1

C++ 11にもこれがあります。 –

6

C++ 11では、多くの特性が標準ライブラリに追加されています。特に、興味深い特殊化(特にビット単位の操作)を目的としています。

  • std::is_trivially_default_constructible
  • std::is_trivially_copy_constructible
  • std::is_trivially_move_constructible
  • std::is_trivially_copyablememcpy経由でコピーすることができます)
  • :あなたが興味がある可能性

    トップレベルの特色は、しかし、多くの人があり、std::is_trivialです

一般的に、Standardはできるだけ細かい粒度の特性を得るようにしましたので、is_podのような幅広い仮定に頼る必要はなく、メソッドが実際に必要とするものと一致するように微調整してください。

関連する問題