2011-01-28 12 views
6

mam coś takiego:Jak mogę wyspecjalizować typedef i jego domyślny typ w inny sposób?

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

I naprawdę nie trzeba się specjalizować na int, co naprawdę potrzebne jest do wykonania różnych funkcji dla AnotherType. I nie mogę zmienić definicji Innego rodzaju ani funkcji podstawowej.

Przeciążenie nie pomaga z powodu SFINAE.

Odpowiedz

2

Można użyć BOOST_STRONG_TYPEDEF.

+0

Nie mogę włączyć biblioteki zewnętrznej w tym momencie, ale myślę, że pomysł silnego Typedef jest dokładnie tym, o czym myślałem: klasą, która działa dokładnie tak, jak mój podstawowy typ. Chociaż Boost silny typedef wydaje się ograniczony, prawdopodobnie nie działałby, nawet gdybym mógł go uwzględnić. – Frigg

+0

To jest tak blisko rozwiązania jak ja W moim przypadku okazało się, że jest to najmniej zła opcja. – Frigg

3

Odpowiedź brzmi: nie. Kiedy wpiszesz, utworzysz alias dla typu, a nie rzeczywisty typ sam w sobie. Kompilator potraktuje oba tak samo. Dlatego:

typedef int Foo; 
typedef int Bar; 

Bar bar = 1; 
Foo foo = bar; 

Kompiluje. Obaj są ints.

+0

Myślę, że OP wie o tym, IMO, pyta, czy istnieje sposób obejścia go przy użyciu szablonów. +1 dla poprawnej odpowiedzi. –

+0

Rzeczywiście to wiem. Ale jestem zdesperowany :( – Frigg

+0

@Frigg Niestety nie jest to możliwe z powodów wymienionych powyżej.Jednak jedynym sposobem jest utworzenie innej funkcji, którą ręcznie wywołujesz dla obiektów tego typu. – wheaties

1

Jestem prawie pewny, że nie można traktować kompilatora int i elementu innego typu inaczej. Wszystkie typedef ma typy aliasów - w rzeczywistości nie tworzy nowego typu; z definicji konstruktu typedef kompilator będzie traktował int i odpowiednik typu atrybutu w każdym przypadku.

Jeśli potrzebujesz typu tylko z int, który jest traktowany inaczej, prawdopodobnie powinieneś po prostu utworzyć pojedynczego użytkownika struct. Większość operacji na zawartym int będzie kompilować się do tego samego kodu maszynowego, co zwykła int, ale teraz twój typ danych może mieć własne specjalizacje szablonowe i takie.

+0

Nie opcja, ponieważ wszystkie istniejący kod wokół elementu innego nie będzie działał – Frigg

0

Kompilator potraktuje obie specjalizacje jako dokładnie takie same, ponieważ AnotherType jest po prostu inną nazwą dla int. Mówisz, że nie musisz specjalizować się w int, więc po prostu całkowicie usuń specjalizację i pozwól jej specjalizować się na jakimkolwiek typie, do którego przyda się AnotherType.

+0

Nie mogę tego zrobić.Muszę zrobić coś RÓŻNEGO dla innego rodzaju, niż dla int. – Frigg

1

Nie mogę zmienić definicji funkcji innej czcionki ani funkcji podstawowej.

Następnie jesteś wkręcony. Przepraszam. Jedyną dostępną opcją, silnym typedef, nie jest opcja, jeśli nie możesz zmienić definicji, aby użyć silnego typedef.