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中也是如此。