web-dev-qa-db-ja.com

オプションのテンプレートパラメータ

たとえば、C++でオプションのテンプレートパラメータを使用することは可能ですか?

template < class T, class U, class V>
class Test {
};

ここで、ユーザーにこのクラスをVありまたはVなしで使用してもらいたい

以下は可能ですか

Test<int,int,int> WithAllParameter
Test<int,int> WithOneMissing

はいの場合、これを行う方法。

28
Avinash

デフォルトテンプレート引数を持つことができます。これは目的に十分です。

template<class T, class U = T, class V = U>
class Test
{ };

今、次の仕事:

Test<int> a;           // Test<int, int, int>
Test<double, float> b; // Test<double, float, float>
26
ildjarn

もちろん、デフォルトのテンプレートパラメータを設定できます。

template <typename T, typename U, typename V = U>

template <typename T, typename U = int, typename V = std::vector<U> >

標準ライブラリはこれを常に行います-ほとんどのコンテナは2から5のパラメータを取ります!たとえば、unordered_mapは実際には次のとおりです。

template<
    class Key,                        // needed, key type
    class T,                          // needed, mapped type
    class Hash = std::hash<Key>,      // hash functor, defaults to std::hash<Key>
    class KeyEqual = std::equal_to<Key>, // comparator, defaults to Key::operator==()
    class Allocator = std::allocator<std::pair<const Key, T>> // allocator, defaults to std::allocator
> class unordered_map;

通常は、これ以上考えずにstd::unordered_map<std::string, double>として使用します。

28
Kerrek SB