2014-07-22 12 views
6

Dozwolone jest pozostawienie pustych szablonów argumentów (używając <>), jak zostawić pusty argument pozycyjny lub przerobić go, aby uzyskać ten sam efekt.Domyślne argumenty pozycyjne w szablonach C++ 11

template <int i = 0, int j = 1, int k = 2> 
void blah() { 
    std::cout << i << " " << j << " " << k << std::endl; 
} 

int main() { 
    blah();  // ok 
    blah<>();  // ok 
    blah<1>();  // ok, i = 1 
    blah<1,,3>(); // not ok, i = 1, j = 1 (default), k = 3 
    return 0; 
} 
+0

To nie jest możliwe, aby zrobić jak można w Pythonie argumenty są identyfikowane przez pozycję, a nie przez żaden identyfikator jako taki – EdChum

Odpowiedz

11

Nie można tego zrobić. Musisz to przekazać.

Oto propozycja:

auto constexpr default_j = 1; 

template <int i = 0, int j = default_j, int k = 2> 
void blah() { 
    std::cout << i << " " << j << " " << k << std::endl; 
} 

int main() { 
    blah();     // ok 
    blah<>();    // ok 
    blah<1>();    // ok, i = 0 
    blah<1, default_j, 3>(); // ok, explicit and without duplicate magic numbers! 
    return 0; 
} 
7

Zabawa z makr (nie próbujcie tego w domu, dla dzieci):

#include <iostream> 

template <int i = 0, int j = 1, int k = 2> 
void blah() { 
    std::cout << i << " " << j << " " << k << std::endl; 
} 

#define _blah(D, V) (*#V ? V + 0 : D) 
#define blah_3(I,J,K) blah<_blah(0,I), _blah(1,J), _blah(2,K)>() 
#define blah_2(I,J) blah_3(I,J,) 
#define blah_1(I) blah_3(I,,) 
#define blah__(_1,_2,_3,X,...) blah ## X 
#define blah(...) blah__(__VA_ARGS__,_3,_2,_1)(__VA_ARGS__) 

int main() { 
    blah(); 
    blah(, ,); 
    blah(1); 
    blah(1,,); 
    blah(1, ,3); 
    return 0; 
} 
+3

... A kiedy rodzice wrócili do domu, byli przerażeni. – bolov

+2

... Uziemili go na 2 tygodnie. – bolov

+1

What the ... whaaaa ... – Quentin

Powiązane problemy