2

オプションのテンプレート パラメータを実装するにはどうすればよいですか?

MyStruct<T1,T2,T3>最初または最初の 2 つのパラメーターのみを使用できるclass が必要です。これで、処理する関数MyStruct<T1,T2,T3>も未使用のテンプレート パラメータを何らかの方法で正しく処理する必要があります。

例:

#include <iostream>

template<class T1, class T2, class T3>
struct MyStruct {
  T1 t1; T2 t2; T3 t3;
  MyStruct() {}
  MyStruct(T1 const& t1_, T2 const& t2_, T3 const& t3_)
    : t1(t1_), t2(t2_), t3(t3_) {}
};

template<class T1, class T2, class T3>
MyStruct<T1, T2, T3> myplus(MyStruct<T1, T2, T3> const& x,
                MyStruct<T1, T2, T3> const& y) {
  return MyStruct<T1, T2, T3>(x.t1 + y.t1, x.t2 + y.t2, x.t3 + y.t3);
}

int main() {
  typedef MyStruct<int, double, std::string> Struct;
  Struct x(2, 5.6, "bar");
  Struct y(6, 4.1, "foo");
  Struct result = myplus(x, y);
  // (8, 9.7, "barfoo")
  std::cout << result.t1 << "," << result.t2 << "," << result.t3;
}

上記の関数が引き続き機能するようにコードを変更したいと思いますmain()が、次の関数も機能します。

typedef MyStruct<std::string, int> Struct;
// result: ("barfoo", 5)
Struct result = myplus(Struct("bar", 2), Struct("foo", 3));

またはこれ:

typedef MyStruct<int> Struct;
// result: (5)
Struct result = myplus(Struct(2), Struct(3));

、、boost::tupleを使用できる同様のトリックを使用していると思いますが、彼らがどのようにそれを行うのかはわかりません。boost::tuple<A>boost::tuple<A,B>boost::tuple<A,B,C>

4

3 に答える 3

3

これは、C++ 11 の可変個引数テンプレートを使用して行うことができます (より難しく、より複雑なオプション)。または、デフォルトのテンプレート パラメータを Boost.Tuple として使用できます。

// boost/tuple/tuple/detail/tuple_basic.hpp

// -- null_type --------------------------------------------------------
struct null_type {};

//...

// - tuple forward declaration -----------------------------------------------
template <
  class T0 = null_type, class T1 = null_type, class T2 = null_type,
  class T3 = null_type, class T4 = null_type, class T5 = null_type,
  class T6 = null_type, class T7 = null_type, class T8 = null_type,
  class T9 = null_type>
class tuple;
于 2012-05-22T21:11:42.563 に答える
3

正しく理解できれば、テンプレートのデフォルト パラメータを渡すことができるはずです。

template<class T1, class T2 = Default, class T3 = Default>

の代わりに任意のタイプを使用できますDefault

于 2012-05-22T21:11:52.650 に答える
1

意図的に「未使用」タイプを作成できます。

namespace detail { struct unused { }; }

template <typename T1, typename T2 = detail::unused, typename T3 = detai::unused>
struct MyStruct
{
    typedef T1 type1;
    typedef T2 type2;
    typedef T3 type3;

    explicit MyStruct(type1 const & t1,
                      type2 const & t2 = type2(),
                      type3 const & t3 = type3())
    : x1(t1), x2(t2), x3(t3)
    {  }

private:
    type1 x1;
    type2 x2;
    type3 x3;
};
于 2012-05-22T21:10:34.307 に答える