C ++ 11模板中的默认位置参数

时间:2014-07-22 07:18:47

标签: c++ templates 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;
}

2 个答案:

答案 0 :(得分:11)

不可能这样做。你必须通过它。

这是一个建议:

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;
}

答案 1 :(得分:7)

有趣的宏(不要在家里试试,孩子们):

#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;
}