Какова цель std :: common_type? - PullRequest
20 голосов
/ 28 июня 2011

Я начал смотреть на std::common_type и не совсем уверен в его назначении и его функциональности. Несколько вещей все еще кажутся мне странными:

  • Порядок аргументов важен: common_type<Foo, Bar, Baz> может отличаться от common_type<Baz, Foo, Bar>. Любой может скомпилировать, другой нет. Хотя это ясно из определения common_type, оно кажется странным и не интуитивным. Это из-за отсутствия универсального решения или предназначено?
  • Инстанциация может привести к ошибке компилятора вместо того, что я могу обработать. Как проверить, скомпилируется ли common_type? is_convertible недостаточно, поскольку common_type может быть специализированным?
  • До сих пор нет способа выяснить общий тип в такой ситуации:

    struct Baz;
    struct Bar { int m; };
    struct Foo { int m; }; 
    struct Baz { Baz(const Bar&); Baz(const Foo&); };
    

    Рекомендуемое решение - специализировать common_type, что утомительно. Есть ли лучшее решение?

Для справки см. §20.9.7.6 Таблица 57 в N3242.

1 Ответ

26 голосов
/ 28 июня 2011

std::common_type был введен для использования с std::duration --- если вы добавите std::duration<int> и std::duration<short>, тогда результат должен быть std::duration<int>. Вместо того, чтобы указывать бесконечный поток разрешенных пар, было принято решение делегировать отдельный шаблон, который нашел результат, используя правила основного языка, применимые к оператору ?: арифметика-если.

Люди увидели, что этот шаблон может быть в целом полезным, и он был добавлен как std::common_type и расширен для обработки произвольного числа типов. В библиотеке C ++ 0x она используется только для пар типов.

Вы должны быть в состоянии использовать новые правила SFINAE, чтобы определить, является ли действительным какое-либо создание экземпляра std::common_type. Я не пробовал все же. В большинстве случаев, если «общего типа» не существует, вы ничего не можете сделать, так что ошибка компиляции является разумной.

std::common_type не волшебство - оно следует правилам ?:. Если true?a:b скомпилируется, std::common_type<decltype(a),decltype(b)>::type даст вам тип результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...