2011-04-11 12 views
16

Czy to jakoś możliwe? Chcę, aby to umożliwić przekazywanie argumentów podczas kompilacji. Załóżmy, że jest to tylko dla wygody użytkownika, ponieważ zawsze można wpisać prawdziwy typ za pomocą template<class T, T X>, ale w przypadku niektórych typów, tj. Funkcji wskaźnik-do-członka, jest to bardzo uciążliwe, nawet z decltype jako skrótem. Rozważmy następujący kod:Czy można emulować szablon <auto X>?

struct Foo{ 
    template<class T, T X> 
    void bar(){ 
    // do something with X, compile-time passed 
    } 
}; 

struct Baz{ 
    void bang(){ 
    } 
}; 

int main(){ 
    Foo f; 
    f.bar<int,5>(); 
    f.bar<decltype(&Baz::bang),&Baz::bang>(); 
} 

Czy można go w jakiś sposób przekonwertować na następujące?

struct Foo{ 
    template<auto X> 
    void bar(){ 
    // do something with X, compile-time passed 
    } 
}; 

struct Baz{ 
    void bang(){ 
    } 
}; 

int main(){ 
    Foo f; 
    f.bar<5>(); 
    f.bar<&Baz::bang>(); 
} 
+0

@GMan: Zaktualizowano, mam nadzieję, że teraz ma to więcej sensu. :) – Xeo

Odpowiedz

12

Po aktualizacji: nie. Nie ma takiej funkcji w C++. Najbliższe jest makra:

#define AUTO_ARG(x) decltype(x), x 

f.bar<AUTO_ARG(5)>(); 
f.bar<AUTO_ARG(&Baz::bang)>(); 

Brzmi jak chcesz generator:

template <typename T> 
struct foo 
{ 
    foo(const T&) {} // do whatever 
}; 

template <typename T> 
foo<T> make_foo(const T& x) 
{ 
    return foo<T>(x); 
} 

Teraz zamiast literowania:

foo<int>(5); 

można zrobić:

make_foo(5); 

Aby wydedukować argument.

+4

Jest to jeszcze bardziej przydatne w C++ 0x, gdzie można użyć 'auto my_foo (make_foo (5));' bez konieczności nazwania typu 'foo ' w całości. –

+0

jeśli przekazanie argumentu do funkcji byłoby problemem, wówczas osoba pytająca mogłaby bezpośrednio użyć 'f.bar (5);' i zadeklarować metodę po prostu jako 'template void bar (T &X);'. Jaki jest pożytek z twojego 'make_foo()'? – iammilind

+0

@iammilind: To było dla starego domysłu na jego pytanie, zanim wyjaśnił. – GManNickG

1

To NIE jest możliwe. Jedynym sposobem, aby osiągnąć to towarzysza argumentu do funkcji:

struct Foo{ 
    template<class T> void bar(T& X) {} 
}; 

a następnie wywołać funkcję jak,

f.bar(5); 
f.bar(&Baz::bang); 
Powiązane problemy