1

次のシナリオでは、テンプレートの特定の特殊化専用のコンストラクターを定義できますか?

template<typename T, size_t D>
class vector {
  T values[D];
public:
  vector();
};

D引数に応じて追加したいコンストラクター:

template<typename T>
vector<T, 2>::vector(T t1, T t2) { ... }

template<typename T>
vector<T, 3>::vector(T t1, T t2, T t3) { ... }

template<typename T>
vector<T, 4>::vector(T t1, T t2, T t3, T t4) { ... }
4

2 に答える 2

8
template<bool B>
using EnableIfB = typename std::enable_if<B, int>::type;

template<typename T, size_t D>
class vector {
  T values[D];
public:
  template<size_t D1 = D, EnableIfB<D1 == 2> = 0>
  vector(T t1, T t2) { ... }

  template<size_t D1 = D, EnableIfB<D1 == 3> = 0>
  vector(T t1, T t2, T t3) { ... }

  template<size_t D1 = D, EnableIfB<D1 == 4> = 0>
  vector(T t1, T t2, T t3, T t4) { ... }
};

お役に立てれば。

于 2012-06-28T19:58:13.217 に答える
0

プライマリテンプレートのすべてのコンストラクターを定義してから、各コンストラクターでアリティが一致することを確認することを検討してvector<T, D>くださいstatic_assert。例えば:

vector(T t0, T t1)
{
    static_assert(D == 2, "Eeeeeeeekkkkk!  Wrong constructor!");
}
于 2012-06-28T19:58:03.053 に答える