Локальный тип в качестве аргумента шаблона запрещен в C ++ 03:
template<typename T>
struct Foo { };
void Make()
{
struct Unknown {};
Foo<Unknown> foo; // Bad
}
Есть ли в Стандарте директивы о проверке этого правила в случае шаблона не создан?
Можно ли быть уверенным, что это правило проверяется только после попытки создания шаблона (без создания экземпляра => успех компиляции)?
template<typename T>
struct Foo { };
template<typename T>
void Do(T&) { }
template<typename T>
void Do(T*) // usage with pointer is forbidden by-design
{
struct Unknown {};
Foo<Unknown>::UnknownMethod();
}
int main()
{
std::string s;
Do(s);
}
В C ++ 03 такой директивы нет, потому что
Он не должен быть успешным, если шаблон не создан.
С другой стороны, некоторые компиляторы разрешают локальные типы в качестве параметров шаблона (например, Visual C ++; нет, он не соответствует стандарту, но это срок службы), поэтому вы все равно не сможете использовать его для принудительного сбоя компиляции.
Если вам нужно потерпеть неудачу при компиляции, когда попытается какая-то комбинация, используйте стандартное статическое утверждение. Вы можете использовать Boost.Static Assert реализация, реализация связана с πάντα ῥεῖ в комментариях или простая реализация в этом другом вопросе / ответе1
template<typename T>
struct Foo { };
template<typename T>
void Do(T&) { }
template<typename T>
void Do(T*) // usage with pointer is forbidden by-design
{
BOOST_STATIC_ASSERT(false);
}
1Я не уверен, правильно ли это, хотя; Я думаю, что реализация может завершиться неудачей, даже если не будет создан экземпляр, если аргумент не зависит от аргумента в прилагаемом шаблоне.