2013-07-05 3 views
0

Допустим, я шаблонный класс определяется как:Тестирование параметров шаблона для равенства

template < typename A, typename B > 
class something { ... } 

Как я могу проверить, если типы А и В одного и того же типа? Я знаю, что это можно сделать во время выполнения с помощью typeid, но мне действительно нужно, чтобы это был тест времени компиляции.

Также, как я могу специализировать класс, если типы A и B равны?

В реальном мире A будет контейнером stl, например std :: string, а B будет char или wchar_t. Внутри я уже проверял контейнеры value_type (скомпилировать ошибку, если не то, что ожидалось). Если B совпадает с контейнером value_type, большая часть кода в классе станет излишней.

+1

возможный дубликат [Как проверить, если два параметра шаблона точно так же?] (Http://stackoverflow.com/questions/14635413/how-to-check-if -two-template-parameters-are-same-same- – hmjd

+0

@hmjd Аналогичный вопрос, другой ответ. –

+2

@hmjd: Есть аналогичный вопрос И не похожий. На самом деле этот вопрос задает слишком много. –

ответ

6

Также, как я могу специализировать класс, если типы A и B равны?

К точно, что, специализируясь:

template <typename A> 
class something<A,A> { ... } 

шаблоны использовать шаблон соответствия для своих списков параметров, как и видели во многих функциональных языках программирования.

Как проверить, являются ли типы A и B одного типа?

Вы можете использовать std::is_same или воспользоваться специализацией, как указано выше. Это зависит от вашего конкретного варианта использования.

+0

Спасибо. Именно то, что я искал. – Twifty

3

Вы можете проверить, если типы одинаковы с помощью:

std::is_same<A, B>::value 

он возвращает истину, если они есть.

1

Как об этом

template <typename A, typename B> 
struct EnsureSameType {}; 

template <typename A> 
struct EnsureSameType<A, A> { 
    typedef int the_template_types_are_different; 
}; 

int main() 
{ 
    /* this should compile */ 
    typedef EnsureSameType<std::string::value_type, char>::the_template_types_are_different _; 
    /* this should fail, and you will see the compiler 
     remind you that the_template_types_are_different */ 
    typedef EnsureSameType<std::string::value_type, wchar_t>::the_template_types_are_different _; 
    return 0; 
} 
+0

Мне очень нравится ваше использование non std. Один меньше #include Мне нужно беспокоиться. – Twifty

+0

Серьезно? Беспокойство по поводу стандартной библиотеки включает в себя? Вам нужно переосмыслить свои приоритеты. –

+0

@Waldermort Я не использую решение STL, просто потому, что я мог получить только значение bool через 'std :: is_same', но на ваш вопрос нужна ошибка компиляции. – neuront

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