C++ 形成对空的引用
我有一个模板类,它应该允许C++ 形成对空的引用,c++,templates,C++,Templates,我有一个模板类,它应该允许void作为模板参数。此类确实有一个传递参数引用的函数,因此我执行了以下操作: template <typename T> struct trait { typedef typename boost::conditional< boost::is_void<T>::value, void, T & >::type type; }; template <typename T
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
}
};
模板
结构特征
{
typedef typename boost::条件<
boost::is_void::value,
无效,T&
>::类型类型;
};
模板
结构foo
{
typename特征::type ref()
{
//做点什么
}
};
然而,编译器声称我将在
struct trait
的实例化中形成对void
的引用。为什么会这样?我怎样才能实现我想要的?好吧,当你说T&
时,你在条件类型定义中清楚地形成了对void
的引用。这似乎最好通过专业化来处理:
template <typename T> struct trait { typedef T& type; };
template <> struct trait<void> { typedef void type; };
模板结构特征{typedef T&type;};
模板结构特征{typedef void type;};
通过使用标准的std::add_lvalue\u reference
,您还可以轻松地复制,该标准仅适用于void
…和const void
和volatile void
等。这是个好主意