Czy można napisać funkcję jako:

void func(uint64_t val) {template <typename T>

Void call_with(std::function f, T val) { f(val); }

Int main() { auto print = [](int x) { std::cout << x; }; call_with(drukuj, 42); }}

Gdzie generowany jest błąd czasu kompilacji, jeśli jest on wywoływany z innym typem liczby całkowitej niż uint64_t, bez modyfikowania moich ostrzeżeń #pragma?

To znaczy:

uint32_t x = 0;
func(x) {…} // Error!
func(uint64_t(x)) {…} // Succes!
3
Viktor Sehr 18 październik 2012, 19:39

2 odpowiedzi

Najlepsza odpowiedź

Przeciąż funkcję szablonem funkcji. Szablon funkcji będzie lepszym dopasowaniem dla wszystkich typów argumentów z wyjątkiem uint64_t. Możesz zdefiniować szablon funkcji, aby w przypadku użycia powodował błąd.

void func(uint64_t val) { ... }

template <typename T>
void func(T)
{
    static_assert(false, "argument type is not uint64_t");
}

W C++11 możesz użyć następującego szablonu:

template <typename T>
void func(T&&) = delete;
5
nosid 18 październik 2012, 20:50

To zadziała:

template< typename T >
void func( T param );

template<>
void func<uint64_t>( uint64_t param )
{
}

Otrzymasz błąd konsolidatora (wystarczająco blisko). Przykład: http://ideone.com/5ft4F

4
Luchian Grigore 18 październik 2012, 20:02