C++ 更改某些默认模板参数

C++ 更改某些默认模板参数,c++,C++,考虑这样一个模板类: template <int opt1 = 1, bool opt2 = false, bool opt3 = true, int opt4 = 50> class X { }; X<opt2 = true> x; 模板 类X{}; 我试图改变一个参数,但是C++似乎不能改变这个参数。还是我错了?如何实现这样的目标: template <int opt1 = 1,

考虑这样一个模板类:

template <int opt1 = 1,
          bool opt2 = false,
          bool opt3 = true,
          int opt4 = 50>
class X  { };
X<opt2 = true> x;
模板
类X{};
我试图改变一个参数,但是C++似乎不能改变这个参数。还是我错了?如何实现这样的目标:

template <int opt1 = 1,
          bool opt2 = false,
          bool opt3 = true,
          int opt4 = 50>
class X  { };
X<opt2 = true> x;
X;
试试这个:

// opt1 = 1 (provided), opt2 = true (provided), opt3 = true (default), opt4 = 50 (default)
X<1, true> x;
如果前面的函数声明是合法的,那么此调用将执行什么操作

f(1, 2);
它将使用
a=1、b=0、c=2或
a=1、b=2、c=unknown调用
f

尝试以下操作:

// opt1 = 1 (provided), opt2 = true (provided), opt3 = true (default), opt4 = 50 (default)
X<1, true> x;
如果前面的函数声明是合法的,那么此调用将执行什么操作

f(1, 2);

它将调用
f
,使用
a=1,b=0,c=2
a=1,b=2,c=unknown

R.Martinho Fernandes提到的增强版本的工作原理如下:

template <int opt1 = 1,
          bool opt2 = false,
          bool opt3 = true,
          int opt4 = 50>
class X  { };
X<opt2 = true> x;
  • 定义许多选项类型(它们可以是空标记结构,也可以在
    bool
    上模板化以启用/禁用,或者其他任何选项)

  • 您的最终调用现在看起来像:

    X<option_2<true>> x;
    
    X;
    


    类型列表
    获取
    部分留给OP、一位好心的过客编辑或我有更多时间的时候作为练习(很可能还有很多错误)。

    R.Martinho Fernandes提到的Boost版本的工作原理如下:

    template <int opt1 = 1,
              bool opt2 = false,
              bool opt3 = true,
              int opt4 = 50>
    class X  { };
    
    X<opt2 = true> x;
    
  • 定义许多选项类型(它们可以是空标记结构,也可以在
    bool
    上模板化以启用/禁用,或者其他任何选项)

  • 您的最终调用现在看起来像:

    X<option_2<true>> x;
    
    X;
    


    typelist
    get
    部分留给OP,一个亲切的编辑,或者我有更多时间时留给我作为练习(很可能还有很多错误)。

    如果我没有弄错,所有参数,甚至默认参数,需要从左到右一直提供,直到最后一个您想要的默认参数set@emartel我希望这不是答案:-)好吧,该语言不支持位置参数-恐怕您也必须指定所有前置参数。@Martin我没有给C++11太多时间,所以您可能还可以做其他事情do@emartelC++11添加的帮助并不多。您可以通过使它看起来像
    X
    (boost在某些地方使用了这种技术)来伪造它,可变模板简化了实现,但仅此而已。如果在我回家之前没有人用这个写答案,我会这样做。如果我没有弄错,所有参数,甚至是默认参数,都需要从左到右提供,直到最后一个您想要的默认参数set@emartel我希望这不是答案:-)好吧,该语言不支持位置参数-恐怕您也必须指定所有前置参数。@Martin我没有给C++11太多时间,所以您可能还可以做其他事情do@emartelC++11添加的帮助并不多。您可以通过使它看起来像
    X
    (boost在某些地方使用了这种技术)来伪造它,可变模板简化了实现,但仅此而已。如果在我回家之前没有人用这个写答案,我会这样做。这很清楚,但问题是,列举前面所有的论点是否真的有必要。即使在C++11中也是如此。这是很清楚的,但问题是,列举前面的所有参数是否真的有必要。即使在C++11中也是如此。