C++ 如果T可以是空的,那么如何在boost中安全地获得(T)的大小?
我试图找出如何编译一些代码,这些代码将决定T的返回值的大小,其中T是函数模板中的一个函数原型C++ 如果T可以是空的,那么如何在boost中安全地获得(T)的大小?,c++,boost,boost-mpl,C++,Boost,Boost Mpl,我试图找出如何编译一些代码,这些代码将决定T的返回值的大小,其中T是函数模板中的一个函数原型 template<typename T> void functionReturnLength() { long lReturnTypeSize = boost::mpl::eval_if< boost::is_void<boost::function_types::result_type<T>::type>::value, boost::mpl
template<typename T>
void functionReturnLength()
{
long lReturnTypeSize = boost::mpl::eval_if<
boost::is_void<boost::function_types::result_type<T>::type>::value,
boost::mpl::long_<0>,
boost::mpl::long_<boost::mpl::sizeof_<boost::function_types::result_type<T>::type>::value>>::value;
}
模板
void函数returnlength()
{
long lReturnTypeSize=boost::mpl::eval_如果<
boost::is_void::value,
boost::mpl::long,
boost::mpl::long_>::值;
}
但是它仍然无法编译,因为sizeof(void)不是有效的操作-即使我试图构造一个if语句,如果类型为void,该语句将返回大小为0的值。我对推进MPL还相当陌生,因此,虽然我已经浏览了一段时间的文档,但我不确定如何应用其他if,比如if_u或apply_uif,以及这些if是否有效
谢谢。您可以使用自己的元函数
template<typename T>
struct get_size { static const size_t value = sizeof(T); };
template<>
struct get_size<void> { static const size_t value = 0; };
模板
结构get_size{static const size_t value=sizeof(t);};
模板
结构get_size{static const size_t value=0;};
更好的是,他可以说value=void_have no_usize()
,这会使编译器抱怨没有诸如void_没有size()
@paulmanta:OP的愿望是为void获取0。@显然,curiousguy。但在某些情况下,这是一个理想的事情。“好奇的家伙,当你知道你的模板不能正确地使用某个类型时,你就不能编译那个特定的类型。”