目前,我试图让一些代码对不同类型做出不同的反应。这不是确切的代码,但它可以传递信息。带有可变参数的元组内容的部分专精
template<class A, class B>
struct alpha {
enum { value = 0 };
};
template<class T, class... Args>
struct alpha<std::tuple<Args...>, T> {
enum { value = 1 };
};
// This gets ignored
template<class T, class... Args>
struct alpha<std::tuple<Args..., std::vector<T> >, T> {
enum { value = 2 };
};
// This gets ignored
template<class T, class... Args>
struct alpha<std::tuple<Args..., T>, T> {
enum { value = 3 };
};
template<class T, class... Args>
struct alpha<T, std::tuple<Args...> > {
enum { value = 4 };
};
template<class... LArgs, class... RArgs>
struct alpha<std::tuple<LArgs...>, std::tuple<RArgs...> > {
enum { value = 5 };
};
int main(int argc, char* argv[]) {
std::cout << alpha<std::tuple<int, double>, double>::value << std::endl; // prints 1
return 0;
}
我已经尝试超过这个代码显示,但没有到目前为止的工作,我在非命名空间范围横跨问题跑了明确的分工。作为参考,我正在研究gcc 4.6(与oneiric服务器一起提供的),我相信它有完整的可变参数模板支持。我不在乎它是多么丑陋,如果这个实现能够检测参数包和其他类型的最后一个参数。有什么建议么?
编辑: 我想根据答案分享我使用的解决方案(这是一个例子)。
template<typename T> struct tuple_last;
template<typename T, typename U, typename... Args>
struct tuple_last<std::tuple<T,U,Args...>> {
typedef typename tuple_last<std::tuple<U,Args...>>::type type;
};
template<typename T>
struct tuple_last<std::tuple<T>> {
typedef T type;
};
namespace details {
// default case:
template<class T, class U>
struct alpha_impl {
enum { value = 1 };
};
template<class T>
struct alpha_impl<T, T> {
enum { value = 101 };
};
template<class T>
struct alpha_impl<T, std::vector<T>> {
enum { value = 102 };
};
// and so on.
}
template<class T, class... Args>
struct alpha<std::tuple<Args...>, T>
: details::alpha_impl<T, tuple_last<std::tuple<Args...>>;
我不知道“解决方案”是什么或者是否有一个。虽然这里还有其他人会知道。 –
至少,这告诉我,没有可能的解决方案使用这种方法,并让我转移到其他人。如果我想出一个我喜欢的,我会发布它。 – norcalli
鉴于这是问题,为什么不在左侧展开包装? – dascandy