形成对void的引用

nij*_*sen 3 c++ templates

我有一个模板类,应该允许void作为模板参数.这个类有一个传递参数引用的函数,所以我做了以下事情:

template <typename T>
struct trait
{
    typedef typename boost::conditional<
        boost::is_void<T>::value,
        void, T &
    >::type type;
};

template <typename T>
struct foo
{
    typename trait<T>::type ref()
    {
        // do something
    }
};
Run Code Online (Sandbox Code Playgroud)

然而编译器声称我会void在实例化中形成一个引用struct trait<void>.为什么这样,我怎样才能实现我的目标?

Die*_*ühl 8

好吧,void当你说时,你明确地在条件类型定义中形成了一个引用T&.这似乎最好处理专业化:

template <typename T> struct trait { typedef T& type; };
template <> struct trait<void> { typedef void type; };
Run Code Online (Sandbox Code Playgroud)

  • 你也可以通过使用标准的`std :: add_lvalue_reference`来简化自己,它只适用于`void`. (3认同)