【发布时间】:2017-10-27 01:26:50
【问题描述】:
我想写一个函数,对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
}
感谢您的帮助。
【问题讨论】:
-
不是 C++14?这很糟糕。
-
是的,需要使用 C++11 而不是 14
-
为什么选择 C++11?它需要支持什么编译器?许多有一些 C++14 特性,这使得这更容易。
-
有趣。我被告知要实现这个“使用 C+11 特性”。没有明确表示不能使用 C++14 特性。我想我实际上已经找到了一种方法来做到这一点......
标签: c++ c++11 tuples variadic-templates template-meta-programming