Как мне получить sizeof (T) безопасно в boost, если T может быть пустым? - PullRequest
4 голосов
/ 02 декабря 2011

Я пытаюсь понять, как я могу получить некоторый код для компиляции, который определит размер возвращаемого значения 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;
}

Однакоон по-прежнему не компилируется, потому что sizeof (void) не является допустимой операцией - хотя я пытаюсь создать оператор if, который будет возвращать размер 0, если тип void.Я довольно новичок в BOOST MPL, поэтому, просматривая документацию в течение некоторого времени, я не уверен, как можно применить другие if, такие как if_ или apply_if, и даже если они будут работать.

Спасибо.

1 Ответ

11 голосов
/ 02 декабря 2011

Вы можете использовать свою собственную метафункцию

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

template<>
struct get_size<void> { static const size_t value = 0; };
...