std::tuple
の各要素に対して操作を実行する関数を記述したいが、その要素が特定の型のものであれば、それが別のタイプのものであれば、別のことをするでしょう。私はすべての要素に同じことを行うことができ、コードがあります。タイプによってタプル要素の特殊な関数を作成する方法
template<std::size_t I = 0, class ...Ts>
inline typename std::enable_if<I == sizeof...(Ts), void>::type
tupel_el_func(std::tuple<Ts...> &t) { } // base case: do nothing
template<std::size_t I = 0, class... Ts>
inline constexpr typename std::enable_if<I < sizeof...(Ts), void>::type
tupel_el_func(std::tuple<Ts...> &t) {
auto el = std::get<I>(t);
// do thing with el
tupel_el_func<I+1, Ts...>(t);
}
を今私は、特定のタイプ(例えばタイプchar*
)のある要素に対して異なることを行うために、この機能を特化する必要があります。私はそうのようなstd::enable_if
を使用して試してみましたが、それはコンパイルされません。
template<int N, typename... Ts>
using NthTypeOf = typename std::tuple_element<N, std::tuple<Ts...>>::type;
template<std::size_t I = 0, class... Ts>
inline constexpr typename std::enable_if<I < sizeof...(Ts) && std::is_same<char*, NthTypeOf<I, Ts...>>::value, void>::type
tupel_el_func(std::tuple<Ts...> &t) {
// function body for when get<I>(t) is a char*
}
template<std::size_t I = 0, class... Ts>
inline constexpr typename std::enable_if<I < sizeof...(Ts) && !std::is_same<char*, NthTypeOf<I, Ts...>>::value, void>::type
tupel_el_func(std::tuple<Ts...> &t) {
// function body for generic next element
}
は助けてくれてありがとう。
Not C++ 14?それは良くないね。 – Yakk
ええ、C++ 11でない必要があります14 –
なぜC++ 11ですか?どのコンパイラがサポートする必要がありますか?多くの人にC++ 14の機能がいくつかありました。 – Yakk