Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果T可以是空的,那么如何在boost中安全地获得(T)的大小?_C++_Boost_Boost Mpl - Fatal编程技术网

C++ 如果T可以是空的,那么如何在boost中安全地获得(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

我试图找出如何编译一些代码,这些代码将决定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::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。但在某些情况下,这是一个理想的事情。“好奇的家伙,当你知道你的模板不能正确地使用某个类型时,你就不能编译那个特定的类型。”