7

一个模板参数可以用在下面的另一个模板参数中:

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;
};

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

4

3 回答 3

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- 您必须明确指定它。

于 2009-09-19T00:45:47.120 回答
0

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

于 2009-09-18T22:50:16.727 回答
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 类型。非类型模板参数仅支持整数类型,然后指向具有外部链接的对象(或类似的东西,也许还有其他一些非常有限的东西)。

于 2009-09-18T22:54:58.313 回答