如何在之前声明的另一个模板参数中使用模板参数

时间:2009-09-18 22:48:12

标签: c++ templates parameters declaration

模板参数可以在另一个跟随它的模板参数中使用:

template<typename T, T N>
struct s
{
};

但如果在“N”之后宣布,是否可以引用“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;
};

编译器可以使用它的功能从第一个和第二个提供的信息中推断出最后一个参数,然后找到要实例化的最佳模板。

3 个答案:

答案 0 :(得分:8)

像其他人说的那样 - 不可能这样,编译器无法从非类型模板参数中推断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); }

在这种情况下,T不会被推断为int - 您必须明确指定它。

答案 1 :(得分:0)

你做不到。我不明白为什么你这样做。

答案 2 :(得分:0)

下面是垃圾,因为我没有正确地阅读你的问题。

事实上,我认为你想要实现的目标也没有任何意义。

#include <iostream>

template<typename T, T N>
struct s
{
    T size() { return N; }
};


int main()
{
    s<int, 4> x;
    std::cout << x.size()<< '\n';

    //s<float, 3.14> f; //this doesn't compile
}

这为GCC和Comeau Online编译。

我认为问题在于您尝试使用的T类型。非类型模板参数仅支持整数类型,然后指向具有外部链接的对象(或类似的东西以及其他一些非常有限的东西)。