2009-09-18 98 views
5

前一个模板参数可以在它后面这种方式的另一个模板参数一起使用:如何在声明的另一个模板参数使用模板参数

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

但有可能引用“T”,如果它是在“N”之后声明?

这不起作用:

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”,实际上它使用这些inf以找到一个功能的最佳过载。 所以通过声明模板是这样的:

template<T A, T B, typename T> 
struct sum 
{ 
    static T const value = A + B; 
}; 

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

回答

6

像别人说的 - 不,这是不可能的,编译器不能从非类型模板参数(在功能的情况下推断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 - 你必须明确地指定它。

+0

感谢您的回答:如果规范说不,它不是。 现在的问题是:为什么这种有限的行为,而似乎有可能做到这一点扣除? 你有一些例子证明这个决定吗? 谢谢。 – Pragmateek 2009-09-19 14:54:03

+0

因为模板元编程从来没有被表达出来? :)虽然有趣的问题。可能 - 你应该检查这是否已经提出,或者为C++ 1x提出这个建议。 – UncleBens 2009-09-19 15:28:09

0

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

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的类型上。非类型模板参数只支持整型类型,然后指向具有外部链接的对象(或类似的东西,也可能是其他一些非常有限的东西)。

相关问题