2011-01-28 2 views
6

У меня есть что-то вроде этого:Как я могу специализировать typedef и его неявный тип по-разному?

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) {...} 

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

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

ответ

2

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

+0

На данный момент я не могу включить внешнюю библиотеку. Но я думаю, что идея сильного typedef - это именно то, о чем я думал: класс, который действует точно так же, как и мой базовый тип. Хотя сильный синтаксис Boost кажется ограниченным, он, вероятно, не сработает, даже если бы я мог его включить. – Frigg

+0

Это как можно ближе к решению I Похоже, для моего конкретного случая он оказался наименее плохим вариантом. – Frigg

3

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

typedef int Foo; 
typedef int Bar; 

Bar bar = 1; 
Foo foo = bar; 

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

+0

Я думаю, что ОП знает об этом, ИМО, он спрашивает, есть ли способ вокруг него при использовании шаблонов. +1 для правильного ответа. –

+0

Действительно, я это знаю. Но я в отчаянии :( – Frigg

+0

@Frigg К сожалению, это просто невозможно по причинам, о которых я говорил выше. О единственном пути вокруг него заключается в создании другой функции, которую вы вручную вызываете для объектов такого типа. – wheaties

1

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

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

+0

Не вариант, потому что все существующий код вокруг AnotherType не будет работать. – Frigg

0

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

+0

Не могу этого сделать. Мне нужно сделать что-то РАЗНОЕ для AnotherType, чем для int. – Frigg

1

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

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