17

現在、私は2つの機能を持っています:

template<typename Type> bool f(Type* x);
template<typename... List> bool f(std::tuple<List...>* x);

これら 2 つの関数を、渡された型がタプルかどうかを示す追加のテンプレート パラメーターとマージする方法はありますか?

template<typename Type, bool IsTuple = /* SOMETHING */> bool f(Type* x);
4

5 に答える 5

18

確かに、 (ここis_specialization_ofからリンクを取得して修正しました)を使用します:

template<typename Type, bool IsTuple = is_specialization_of<Type, std::tuple>::value>
bool f(Type* x);

問題は、しかし、あなたは本当にそれを望んでいますか?通常、型がタプルかどうかを知る必要がある場合は、タプルの特別な処理が必要であり、それは通常、そのテンプレート引数に関係しています。そのため、オーバーロードされたバージョンに固執することをお勧めします。

編集:特殊な部分のみが必要であると述べたので、オーバーロードをお勧めしますが、小さな特別な部分のみに限定してください:

template<class T>
bool f(T* x){
  // common parts...
  f_special_part(x);
  // common parts...
}

template<class T>
void f_special_part(T* x){ /* general case */ }

template<class... Args>
void f_special_part(std::tuple<Args...>* x){ /* special tuple case */ }
于 2012-10-27T14:35:26.387 に答える
5

関数を別の関数に任せることができます:

template<typename Type,bool IsTuple> bool f(Type *x);

template<typename Type> 
inline bool f(Type* x) { return f<Type,false>(x); }

template<typename... List> 
inline bool f(std::tuple<List...>* x) { return f<std::tuple<List...>,true>(x); }
于 2012-10-27T14:49:20.687 に答える
5

C++11 では、これが私の好みのパターンです。

// IsTuple<T>()
template <typename T>
struct IsTupleImpl : std::false_type {};

template <typename... U>
struct IsTupleImpl<std::tuple <U...>> : std::true_type {};

template <typename T>
constexpr bool IsTuple() {
  return IsTupleImpl<decay_t<T>>::value;
}

よく働く。依存関係はありません (Boost は使用できません)。

于 2018-06-28T01:45:17.960 に答える