模板参数可以在其后的另一个模板参数中使用,如下所示:
template<typename T, T N>
struct s
{
};
但是如果在“N”之后声明“T”,是否可以引用“T”?
这不起作用:
template<T N, typename T>
struct s
{
};
我们可以通过预先声明“T”或做其他事情来帮助编译器吗?
提前致谢。
编辑:正如前两个回复问“你为什么愿意这样做?”我将解释目标:
我想让编译器推断出类型“T”,以便更轻松地使用模板化类。
例如 :
template<typename T, T A, T B>
struct sum
{
static T const value = A + B;
};
该模板可以这样使用:
sum<int, 1, 2>::value
但如果能这样使用那就更好了:
sum<1, 2>::value
从技术上讲,这应该是可能的,因为编译器知道“1”和“2”:“int”的类型,并且实际上它使用这些信息来找到函数的最佳重载。
因此,通过这样声明模板:
template<T A, T B, typename T>
struct sum
{
static T const value = A + B;
};
编译器可以利用其功能从第一个和第二个参数提供的信息推断最后一个参数,然后找到最佳模板进行实例化。