2011-11-09 7 views
2

私はVisual C++ 2008でコンパイルされたstd::vectorのようなクラスを持っています。そのクラスには、格納された要素が移動されるピースがあります。ボディが再割り当てされるか挿入/部分消去が行われます。現在、いくつかのタイプはmemmove() dになることがありますが、新しいタイプの場所でコピーを作成して元の場所で破棄する必要があるタイプもあります。Visual C++ 9で型特性を使用してビット単位で移動可能な型を検出するにはどうすればよいですか?

現在、「コピーコンストラクトを破棄してください」というテンプレート機能があります。memmove() dの各タイプの特殊化があります。私はその作業を簡素化するためにV isual C++ 2008 support of type traitsを使用したいと思います。

それぞれのPODについては、memmove()が自動的に選択されます。 memmove() dとなるタイプがテンプレート化された関数を使用して移動されても問題ありませんが、反対の状況は許容できません。memmove() dでないデータ型はmemmove()です。

組み込み型の場合__is_pod()のように見えますが、MSDNではfalseを返します。だから私は__is_class()を使用して、最初に非クラスを除外する必要があると思います。

は、だから私は、次のように行いますけれども:

if(!__is_class(T)) { // not a struct and not a class - built-in type 
    //memmove() 
} else if(__is_pod(T)) { // is a struct or a class and is a POD 
    //memmove() 
} else { // is a struct or a class and is not a POD 
    //DefaultMoveViaCopy() 
} 

ウィル私の解決策の仕事は大丈夫?

+3

'(__ is_class(T)|| __is_pod(T)!){/ * MEMMOVE()* /}他{/ *コピー* /}' –

+0

あなたは可能性がある場合同じ問題に直面している 'std :: copy'実装を見てみたいと思います。 http://connect.microsoft.com/VisualStudio/feedback/details/552877/inefficient-std-copyを参照してください。 – MSalters

答えて

1

ブーストのenable_ifを使用する:

template <typename T, class Enabler = void> 
struct SmartCopy 
{ 
    static void apply(const T& obj, T* dest) 
    { 
     // Generic copy... 
    } 
} 

template <typename T> 
struct SmartCopy<T, typename boost::enable_if_c<__is_pod(T) || !__is_class(T)>::type > 
{ 
    static void apply(const T& obj, T* dest) 
    { 
     // memmove version... 
    } 
} 

template <typename T> 
void smart_move(const T& obj, T* dest) 
{ 
    SmartCopy<T>::apply(obj, dest); 
} 
関連する問題