[英]Confusion about template parameters
最近在c++练习template
的使用,过程中对模板参数有一个困惑。
例如,在下面的代码中, template<typename A>
的输入A
作为“类型”来构造 function 和变量。
template <typename A>
A add_simple(A a, A b)
{
return a + b;
}
但是,在下面的示例中,我实现了一个单位转换操作,输入M1
和M2
似乎充当了对象。 在main()
中,我展示了如何调用该结构。
// create a template struct Measure with value and unit. e.g. Measure<int, Unit>::value
template<int v, Unit u> struct Measure{
static const int value=v;
static const Unit unit=u;
};
// Conversion struct. expected input two 'Measure' objects.
template <typename M1, typename M2>
struct Measure_add {
public:
// other implementation
static constexpr int value=M1::value+M2::value;
};
int main(int, char**) {
std::cout << Measure_add< Measure<10,Unit::m>,
Measure<20,Unit::m> >::value << std::endl;
}
所以我对模板的困惑是:
<template>
是否设计得如此灵活,以至于它可以动态区分输入,因此“类型”输入和“对象”输入都可以工作。 或者我在这里遇到的不同是因为预期输入是构造模板输入Measure
? 因此,M1 和 M2 仍然是“类型”,即Measure
。 在这种情况下,如果 M1 是一种类型而不是 object,为什么M1::value
可用?
为什么可以访问模板结构Measure_add
中的M1::value
或M2::value
,尽管此类结构的输入未知。 换句话说,如果我输入其他不包含属性value
的参数,是否会引起问题?
在您的代码中, M1
和M2
都是类型模板参数。 您可以说M::value
的原因是value
是一个 static 类型的数据成员,该类型替代了M
。 这就是static
数据成员的要点:您不需要 object 来访问它的值。 这与模板无关:
struct M {
static constexpr int value = 0;
};
int foo() {
return M::value; // OK
}
M1
和M2
不限于Measure
模板的特化:它们可以是具有 static value
数据成员的任何类型。 对于不满足此条件的其他类型,您只会收到编译错误。
std::cout <<
Measure_add<
std::integral_constant<int, 10>,
std::integral_constant<int, 20>
>::value; // compiles, prints 30
和
std::cout <<
Measure_add<
Measure<10, Unit::m>,
std::integral_constant<int, 20>
>::value; // compiles, prints 30, but makes no sense
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.