2009-09-18 22 views
5

parametr szablon można wykorzystać w inny parametr szablonu, która następuje to w ten sposób:Jak używać parametru szablonu w inny parametr szablonu zadeklarowane przed

template<typename T, T N> 
struct s 
{ 
}; 

ale jest to możliwe do odniesienia „T” jeśli jest to zadeklarowane po "N"?

To nie działa:

template<T N, typename T> 
struct s 
{ 
}; 

Możemy pomóc kompilator przez pre-deklarując "T" lub cokolwiek innego?

Dzięki z góry.

EDYCJA: ponieważ dwie pierwsze odpowiedzi dotyczyły pytania "dlaczego chcesz to zrobić?" Wyjaśnię cel:

Chciałbym, aby kompilator wywnioskował typ "T", aby ułatwić korzystanie z szablonów.

Na przykład:

template<typename T, T A, T B> 
struct sum 
{ 
    static T const value = A + B; 
}; 

Ten szablon może być używany w ten sposób:

sum<int, 1, 2>::value 

Ale byłoby lepiej, gdyby mógł on być stosowany w ten sposób:

sum<1, 2>::value 

Technicznie powinno być możliwe, ponieważ kompilator zna typy "1" i "2": "int", i faktycznie używa tych inf oracje, aby znaleźć najlepsze przeciążenie dla funkcji. Więc deklarując szablonowi ten sposób:

template<T A, T B, typename T> 
struct sum 
{ 
    static T const value = A + B; 
}; 

kompilator może wykorzystać swoją zdolność do wywnioskować ostatni parametr z informacji dostarczonych przez pierwszy i drugi, a następnie znaleźć najlepszy szablon instancji.

Odpowiedz

6

Jak inni mówią - Nie jest to niemożliwe, kompilator nie można wywnioskować typ T z braku typu szablonu argumenty (w przypadku funkcji, to wnioskuje typy z funkcji argumenty)

14.8.2.4/12: Rodzaj

Wzór argument nie można wywnioskować z takiego typu non-szablonu argumentu.

W każdym razie, nie będzie żadnych potrąceń dla argumentów szablonu klasy. Przykładem może być funkcja szablonu

template<int> struct having_int { }; 
template<typename T, T i> void f(having_int<i>); 
int main() { having_int<0> h; f(h); } 

W tym przypadku T nie będzie wyprowadzona jako int - trzeba wyraźnie określić ją.

+0

Dzięki za odpowiedź: jeśli norma mówi, że nie, to nie. Pytanie brzmi teraz: dlaczego to ograniczone zachowanie, podczas gdy wydaje się możliwe dokonanie tego odliczenia? Czy masz kilka przykładów uzasadniających tę decyzję? Dzięki. – Pragmateek

+0

Ponieważ metaprogramowanie szablonów nigdy nie miało być wyraziste? :) Ciekawe pytanie. Być może powinieneś sprawdzić, czy zostało to zaproponowane, lub złożyć tę propozycję dla C++ 1x. – UncleBens

0

Nie możesz. Nie widzę sensu, dlaczego to robisz.

0

Poniżej znajdują się śmieci, ponieważ nie przeczytałem poprawnie Twojego pytania.

Rzeczywiście, nie widzę sensu w tym, co próbujesz osiągnąć.

#include <iostream> 

template<typename T, T N> 
struct s 
{ 
    T size() { return N; } 
}; 


int main() 
{ 
    s<int, 4> x; 
    std::cout << x.size()<< '\n'; 

    //s<float, 3.14> f; //this doesn't compile 
} 

To kompiluje się dla mnie z GCC i Comeau Online.

Myślę, że problem dotyczy typu T, którego próbujesz użyć. Niestandardowe argumenty szablonów obsługują tylko typy integralne, a następnie wskaźniki do obiektów z zewnętrznym powiązaniem (lub czymś podobnym i być może kilkoma bardzo ograniczonymi rzeczami).