Pra*_*eek 7 c++ parameters templates declaration
模板参数可以在以下方式使用的另一个模板参数中使用:
template<typename T, T N>
struct s
{
};
Run Code Online (Sandbox Code Playgroud)
但如果在"N"之后声明它是否可以引用"T"?
这不起作用:
template<T N, typename T>
struct s
{
};
Run Code Online (Sandbox Code Playgroud)
我们可以通过预先声明"T"或做其他事情来帮助编译器吗?
谢谢你提前.
编辑:因为前两个回复询问"你为什么愿意这样做?" 我将解释目标:
我想让编译器推断类型"T",以便更容易使用模板化类.
例如 :
template<typename T, T A, T B>
struct sum
{
static T const value = A + B;
};
Run Code Online (Sandbox Code Playgroud)
这个模板可以这样使用:
sum<int, 1, 2>::value
Run Code Online (Sandbox Code Playgroud)
但如果可以这样使用它会更好:
sum<1, 2>::value
Run Code Online (Sandbox Code Playgroud)
从技术上讲,它应该是可能的,因为编译器知道"1"和"2"的类型:"int",实际上它使用这些信息来找到函数的最佳重载.所以通过这种方式声明模板:
template<T A, T B, typename T>
struct sum
{
static T const value = A + B;
};
Run Code Online (Sandbox Code Playgroud)
编译器可以使用其功能从第一个和第二个提供的信息中推断出最后一个参数,然后找到要实例化的最佳模板.
像其他人说 - 不,这是不可能的,编译器无法推断T非类型模板参数的类型(在函数的情况下,它从函数参数推断类型):
14.8.2.4/12:
无法从非类型模板参数的类型推导出模板类型参数.
在任何情况下,无论如何都不会对类模板的参数进行推论.函数模板的示例可能是
template<int> struct having_int { };
template<typename T, T i> void f(having_int<i>);
int main() { having_int<0> h; f(h); }
Run Code Online (Sandbox Code Playgroud)
在这种情况下,T不会推断为int- 您必须明确指定它.