很显然,你不能有void
类型的实例在一个结构良好的程序,所以像下面的声明不会编译:void类型的std ::元组
std::tuple<void, double, int> tup;
然而,随着只要我们严格对待类型而不是对象,似乎就没有问题了。例如,我的编译器(GCC)让我说:
typedef std::tuple<void, double, int> tuple_type;
这是对我有意思,因为它似乎与的C++ 0x,我们可以只使用std::tuple
进行了大量的元编程技巧,这以前会需要boost::mpl
库。例如,我们可以使用std::tuple
来创建一个类型的向量。
例如,假设我们要创建的表示函数签名类型的载体:
我们可以只说:
template <class R, class... Args>
struct get_function_signature;
template <class R, class... Args>
struct get_function_signature<R(*)(Args...)>
{
typedef std::tuple<R, Args...> type;
};
这似乎是工作,即使函数签名具有void
类型,只要我们从未实际实例化get_function_signature<F>::type
的实例。然而,C++ 0x对我来说仍然是新的,当然所有的实现都还是有点实验性的,所以我对此有点不安。我们真的可以使用std::tuple
作为元编程类型的向量吗?
我期望`boost :: mpl :: vector`不推荐使用。无论如何,当对可变参数模板的支持增加时,大多数boost :: mpl功能和模板元编程通常都会发生很大的变化。 – 2011-02-03 12:35:16