如果T无效,我如何安全地获得sizeof(T)?

Jer*_*emy 4 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::long_<0>,
    boost::mpl::long_<boost::mpl::sizeof_<boost::function_types::result_type<T>::type>::value>>::value;
}
Run Code Online (Sandbox Code Playgroud)

但是它仍然无法编译,因为sizeof(void)不是有效的操作 - 即使我正在尝试构造一个if语句,如果类型为void,则返回大小为0.我对BOOST MPL很新,所以,虽然我已经浏览了一段时间的文档,但我不知道如何应用if_或apply_if等其他ifs,如果这些甚至可以工作的话.

谢谢.

Aby*_*byx 11

您可以使用自己的元功能

template<typename T>
struct get_size { static const size_t value = sizeof(T); };

template<>
struct get_size<void> { static const size_t value = 0; };
Run Code Online (Sandbox Code Playgroud)

  • @Paul Manta:OP的愿望是获得0无效. (6认同)
  • 更好的是,他可以说`value = void_has_no_size()`,这将使编译器抱怨没有像'void_has_no_size()`这样的函数. (2认同)
  • @curiousguy当您知道模板无法正常使用某种类型时,您可以使其无法编译该特定类型. (2认同)