形成对void的引用

时间:2012-10-19 05:14:00

标签: 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
    }
};

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

1 个答案:

答案 0 :(得分:8)

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

template <typename T> struct trait { typedef T& type; };
template <> struct trait<void> { typedef void type; };