C ++ 11 static_assert (и используемые в нем функции)

static_assert кажется, очень хорошая функция вместе с шаблонами.

Однако у меня возникают проблемы с поиском функций в стандартной библиотеке для выполнения различных тестов во время компиляции.

Например, я ищу функцию, чтобы проверить, является ли тип подтипом другого.boost::is_base_of выполняет работу, однако, является сопоставимой функцией в std, поэтому мне не нужно полагаться на boost.

По сути, есть хороший источник для списка функций, которые могут быть использованы вstatic_assert и содержатся в стандартной библиотеке C ++ 11?

Когдаstatic_assert казнят? Могу ли я поместить его в любом месте шаблона, и он оценивается для каждого экземпляра шаблона? Может ли оно быть использовано для ограничения параметров шаблона как определенного подтипа класса?

 Some programmer dude15 июн. 2012 г., 12:25
Ты пыталсяstd::is_base_of?

Ответы на вопрос(2)

Решение Вопроса

C ++ 11 черновикраздел 20.7, в частности<type_traits> заголовок.

То, что вы спрашиваете, это:std::is_base_of<base, derived>::value;

По поводу вашего вопроса:static_assert может оцениваться всякий раз, когда компилятор посчитает нужным, но обычно он:

In a template: if the expression uses dependent names, in instatiation time; else, in definition time. Out of template: in definition time.
 15 июн. 2012 г., 12:32
@gexicide - Да, это на самом деле причина для & lt; type_traits & gt ;.
 16 июн. 2012 г., 01:02
Да, и если кого-то волнует, что настоящий источник TeX для стандарта теперь находится на GitHub, позаботьтесь о текущем редакторе:github.com/cplusplus/draft
 16 июн. 2012 г., 01:00
Вы можете получить N3337here (5MB pdf), В более поздние версии рабочего документа было внесено больше обновлений и даже исправлений ошибок, и некоторые компиляторы даже реализуют их, но это самый близкий документ к официальному стандарту, который свободно доступен с момента выхода n3290.
 gexicide15 июн. 2012 г., 12:25
отлично, спасибо! Это было именно то, что я искал. Могу ли я использовать его для ограничения параметра типа шаблона?
 15 июн. 2012 г., 15:05
N3092 фактически за год до окончательного варианта. n3290 - это последний доступный черновик до того, как стандарт был закончен. Вероятно, вам следует использовать n3337, который взят сразу после стандартизации, и единственными отличиями от официального стандарта являются исправленные опечатки и тому подобное.

When is static assert executed? Can I put it anywhere in a template and it is evaluated for each template instanciation? Could it be used to constrain template parameters to be a specific subtype of a class?

К сожалению нет. Например,static_assert(false, "bummer"); являетсяalways выполняется независимо от шаблона. Это, в частности, дает сбой, если вы хотите (частично) специализировать шаблон.

Стандарт (& # xA7; 7.4) гласит:

[If the condition to static_assert is false] the program is ill-formed, and the resulting diagnostic message (1.4) shall include the text of the string-literal, […]

К сожалению, это совершенно не специфично, но это отсутствие специфичности на самом делеstatic_assert ведет себя, когда он не зависит от типа шаблона.

Вы должны сделать условие вstatic_assert зависит от аргумента шаблона, чтобы связать его выполнение с конкретным аргументом шаблона.

Так что следующее не получится:

template <typename T>
struct some_type {
    static_assert(false, "T must be a pointer type");
};

template <typename T>
struct some_type<T*> {
    // …
};

Наконец, я от всей души рекомендую вам прочитать статью Мартино оMore type traits в котором подробно описывается этот процесс, и даются советы о том, как элегантно решить многие проблемы, связанные с чертами.

 15 июн. 2012 г., 12:27
+1 Можете ли вы дать ссылку на стандарт?
 15 июн. 2012 г., 12:31
@gexicide Хорошо, это, очевидно, работает, так как условие теперь зависит от типовY а такжеT и этоcannot решаться без их ведома).
 gexicide15 июн. 2012 г., 12:32
отлично, именно то, что я хотел :)
 gexicide15 июн. 2012 г., 12:28
как насчетtemplate <typename T> struct X { static_assert(std::is_base_of<Y,T>::value,"T must be derived from Y!");

Ваш ответ на вопрос