【发布时间】:2011-06-20 13:57:40
【问题描述】:
显然,您不能在格式良好的程序中拥有 void 类型的实例,因此类似以下声明的内容无法编译:
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功能和模板元编程一般都会发生很大变化。