Как я могу по-разному специализировать typedef и его неявный тип? - PullRequest
6 голосов
/ 28 января 2011

У меня есть что-то вроде этого:

typedef int AnotherType;
template <typename T> Func( T Value );

// And I want to specialize these two cases separately:

template <> bool Func<int>( int Value ) {...}
template <> bool Func<AnotherType>( AnotherType Value ) {...}

Мне не нужно специализироваться на int, мне действительно нужно выполнить другую функцию для AnotherType.И я не могу изменить определение AnotherType или базовой функции.

Перегрузка также не помогает из-за SFINAE.

Ответы [ 5 ]

3 голосов
/ 28 января 2011

Ответ - нет.Когда вы вводите typef, вы создаете псевдоним для типа, а не фактический тип сам по себе.Компилятор будет относиться к обоим одинаково.Вот почему:

typedef int Foo;
typedef int Bar;

Bar bar = 1;
Foo foo = bar;

Скомпилирует.Они оба целые.

2 голосов
/ 28 января 2011

Вы можете использовать BOOST_STRONG_TYPEDEF .

1 голос
/ 29 января 2011

И я не могу изменить определение AnotherType или базовой функции.

Тогда ты облажался. Сожалею. Единственный вариант, который у вас действительно есть, сильный typedef, не вариант, если вы не можете изменить определение для использования сильного typedef.

1 голос
/ 28 января 2011

Я почти уверен, что компилятор не может по-разному относиться к int и AnotherType.Все, что делает typedef, это псевдонимы типов - на самом деле он не создает новый тип;по определению конструкции typedef, компилятор будет обрабатывать int и AnotherType эквивалентно во всех случаях.

Если вам нужно иметь тип с просто int, который IS обрабатывается по-разному, вам, вероятно, следует просто сделать один членstruct.Большинство операций над содержащим int будет компилироваться с тем же машинным кодом, что и голое int, но теперь ваш тип данных может иметь свои собственные специализации шаблонов и тому подобное.

0 голосов
/ 28 января 2011

Компилятор будет относиться к обеим специализациям одинаково, поскольку AnotherType - это просто другое имя для int. Вы говорите, что вам не нужно специализироваться на int, поэтому просто удалите эту специализацию полностью и позвольте ей специализироваться на любом типе AnotherType.

...