Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何进行模板化类型化参数专门化?_C++_Templates_Metaprogramming_Template Meta Programming - Fatal编程技术网

C++ 如何进行模板化类型化参数专门化?

C++ 如何进行模板化类型化参数专门化?,c++,templates,metaprogramming,template-meta-programming,C++,Templates,Metaprogramming,Template Meta Programming,我有以下代码: #include <tuple> #include <utility> #include <iostream> template<class T> struct e { }; template <> struct e<int N> { static const int value = N; }; int main() { std::cout << e<5>::v

我有以下代码:

#include <tuple>
#include <utility>
#include <iostream>

template<class T>
struct e {

};

template <>
struct e<int N> {
    static const int value = N;
};

int main() {
    std::cout << e<5>::value << std::endl;
}
#包括
#包括
#包括
模板
结构e{
};
模板
结构e{
静态常数int值=N;
};
int main(){

std::cout您已经为主模板指定了一个typename,因此不能专门指定int的值。您的主模板必须是

template <int N> 
struct e
{ static const int value = N; };

如果已为主模板指定了typename,则不能专门指定int的值。主模板必须是

template <int N> 
struct e
{ static const int value = N; };

您已经反转了术语
是一个非类型模板参数。请解释下一票,以便我可以改进我的问题。您已经反转了术语
是一个非类型模板参数。请解释下一票,以便我可以改进我的问题。为什么我们需要整数常量包装器?来生成值5到类型中。5不是类型。5是int类型的常量值,并且您的主模板希望使用类型而不是值进行实例化。嗯,好的,这开始变得更有意义了。Tenplate重载似乎不会发生在模板块上,而是只发生在struct u typename之后,这一切都与主模板有关。如果pects 1参数是一个类型,那么您的[partial]专门化必须全部归结为一个类型参数。在部分专门化的情况下,您可以“提取”任何您想要的参数(例如,专门化可以有10个参数),只要它们是可推断的(在本例中,它是一个名为“N”的“int”。但最终的组合(在结构e之后的位中)必须与主模板所期望的匹配。在本例中为单一类型。为什么我们需要一个整型常量包装器?将值5转换为一个类型。5不是一个类型。5是int类型的常量值,并且您的主模板希望用一个类型而不是值实例化。嗯,好的,这开始更有意义了。Tenplate o过度加载似乎不会发生在模板块上,但只会发生在struct\uuu typename之后,这是主模板的全部内容。如果这需要1个类型参数,那么您的[部分]专门化必须全部归结为1个类型参数。在部分专门化的情况下,您可以根据需要“拉出”任何参数(例如,专门化可以有10个参数),只要它们是可推断的(在本例中,它是一个名为“N”的“int”。但最终的组合(在结构e之后的位中)必须与主模板所期望的匹配。在本例中,为单一类型。
#include <iostream>
#include <type_traits>

template<class T>
struct e {

};

template <int N>
struct e<std::integral_constant<int,N> > {
    static const int value = N;
};

int main() {
    std::cout << e<std::integral_constant<int,5>>::value << std::endl;
}