Как отличить пустую структуру от одного символа? - PullRequest
2 голосов
/ 13 апреля 2019

Я пытаюсь реализовать собственный функтор и столкнулся с пустыми лямбдами захвата. Как отличить пустую структуру от одного символа? Есть ли "реальный" размер во время компиляции? Я хочу просто игнорировать пустые лямбды, чтобы предотвратить бесполезные выделения.

struct EmptyStruct {};
struct CharStruct { char c; };


int main()
{
    char buffer1[sizeof(EmptyStruct)]; // size 1 byte
    char buffer2[sizeof(CharStruct)]; // size 1 byte
}

1 Ответ

7 голосов
/ 13 апреля 2019

Вы не можете сделать это с sizeof(), используйте std::is_empty, например:

#include <iostream>
#include <type_traits>

struct EmptyStruct {};
struct CharStruct { char c; };
int main(void)
{
  std::cout << std::boolalpha;
  std::cout << "EmptyStruct " << std::is_empty<EmptyStruct>::value << '\n';
  std::cout << "CharStruct " << std::is_empty<CharStruct>::value << '\n';
  return 0;
}

Выход:

EmptyStruct true
CharStruct false

как прокомментировал @RichardCritten.

...