2015-12-08 3 views
1

Допустим, мы имеем структуру, где мне нужно, чтобы проверить типы параметров шаблона (wchar_t это только пример):Статическая утверждают проверки параметров шаблона при создании псевдонима

template <typename T> 
struct Foo { 
    static_assert(std::is_same<T, wchar_t>::value, "Failure"); 
} 

Конечно следующий код не компилируется :

Foo<int> foo; 

Но как я могу предотвратить от компиляции:

using foo = Foo<int>; 

?

+1

Просто экземпляр Foo (тип псевдоним), это то же самое. По мере того, как вы не создаете экземпляр, компилятор не «производит» код, а утверждение не проверяется. – MagunRa

ответ

2

Он не будет компилироваться, когда вы попытаетесь создать foo? Вы изменяете значение foo, как только это переменная, и как только это тип.

#include <iostream> 
using namespace std; 

template <typename T> 
struct Foo { 
    static_assert(std::is_same<T, wchar_t>::value, "Failure"); 
}; 

using FooINT = Foo<int>; 

int main() { 
    FooINT foo; // breaks 
    return 0; 
} 

Таким образом, вы в основном определяете псевдоним типа, который бесполезен. К сожалению, создание определенного псевдонима не приводит к немедленной реализации типа.

Чтобы разработать немного больше. using просто вводит псевдоним, это не «производят» типа, так что возможно следующее:

#include <iostream> 
using namespace std; 

template <typename T> 
struct Foo { 
    static_assert(std::is_same<T, wchar_t>::value, "Failure"); 
}; 

using FooINT = Foo<int>; // should it break now or not? 

template <> 
struct Foo<int> { 
    int A_OK; 
}; 

int main() { 
    FooINT foo; // works now 
    return 0; 
} 

Таким образом, вы не можете сделать using FooINT = Foo<int>; не компилировать сам по себе. Вам понадобится какой-то механизм для фактического создания шаблона.

+0

Спасибо. Возможно, я не был достаточно конкретным, потому что я хотел достичь, чтобы предотвратить компиляцию только с помощью foo = Foo ; без предварительной настройки. Но из-за того, что вы говорите, это невозможно. –

+0

Да, я добавил пример, который показывает, что было бы невозможно, или сбивать с толку, если ваше предложение сработало. Вероятно, поэтому псевдоним - это просто псевдоним, и он не делает больше, кроме, может быть, из соображений производительности. – luk32

4

Если вы действительно хотите, чтобы вызвать ошибку на линии using FooINT = Foo<int>; вы можете использовать вместо параметра шаблона по умолчанию:

template < 
    typename T, 
    typename = std::enable_if_t<std::is_same<T, wchar_t>::value> 
> 
struct Foo { }; 

 Смежные вопросы

  • Нет связанных вопросов^_^