2016-03-20 5 views
0

私はクラスに持っている:異なるタイプの引数を取る関数を書くには?

template <class T> 
class shared_vector 
{ 
    T data; 
} 

template <class T> 
class device_vector 
{ 
    T data; 
} 

私は、任意の種類のオブジェクトをaccects関数fを書き、それがタイプshared_vectorまたはdevice_vectorであることと、それに応じていくつかのフラグを設定します。

ここで明白な解決策は、関数のオーバーロードに行くことです。しかし、関数fが10個の引数をとるとします。これは、shared_vectorまたはdevice_vectorのいずれかになります。 1024オーバーロード関数を記述する必要があります。

別の解決策は、両方からdevice_vectorshared_vector継承するhybrid_vector親クラスを使用することです。

残念ながら、device_vectorコードは私の管理下にありません。

どのようにこの問題を解決する必要がありますか?

注:typeid(変数).name()は型を示すことができますが、関数の宣言はどのようになりますか、どのようにして型を推論できますか?

+1

ビルダーのパターンがこのコンビナトリアル爆発を解決してくれるように思えるかもしれません。 –

+1

これらのさまざまなタイプに共通するものは何ですか? –

+0

または、実際には、スーパータイプのポインタの配列。問題の型を制御しないとすれば、独自のラッパー型を作成できます。 –

答えて

2

boost::variant<shared_vector<T>, device_vector<T>>を受け入れることもできます。

別のオプションがstd::enable_ifです:

template<typename V> 
std:enable_if< 
    std::same_type<V, shared_vector<decltype(V::data)>::value | 
    std::same_type<V, device_vector<decltype(V::data)>::value , 
    void>::type 
foo(V const& vector); 

はまだあなたがV1..V10を持っている場合、冗長になるだろうが、それはわずか2 * 10のチェックではなく、1024ですそしてもちろん、あなたがそれらの2つのテストをラップするis_device_or_shared<Vector>::value自分自身を書くことができますもう少し読みやすいものである。

関連する問題