std :: tuple中的Void类型

时间:2011-02-03 10:37:44

标签: c++ c++11 tuples

显然,在格式良好的程序中不能有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作为元编程的类型向量吗?

2 个答案:

答案 0 :(得分:10)

确实可以做到

typedef std::tuple<void, double, int > tuple_type;

只要您将其用作类型列表即可使用tuple_element。因此我可以做到

tuple_element<0,tuple_type>::type * param;

将param声明为void*

答案 1 :(得分:0)

除非我们将tuple实例化,否则带有void元素的struct C : std::tuple< void > {... 可能是安全的 所以,虽然我们不能写如下,

std::pair

我无法想象这种用法现在很有用。 所以,没关系。

嗯,这也适用于struct Nil; typedef std::pair< void, std::pair< int, Nil > > t; 。 我们可以编写简单的类型列表如下:

pair

虽然以某种方式使用这种tuple似乎很少见。

顺便提一下,std::tuple< void > f(); template< class T > char g( T const& ); int main() { sizeof g( f() ); } 类型列表可能会在某些类似SFINAE的目的中失败。 例如,当我使用时,不会在ideone(gcc-4.5.1)上编译以下代码 测试:

tuple

所以,我不确定当前的类型列表是否可以完全替换 {{1}}在不久的将来。