Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.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

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_Comparison_Derived Class - Fatal编程技术网

C++ 何时使用模板而不是派生类

C++ 何时使用模板而不是派生类,c++,templates,comparison,derived-class,C++,Templates,Comparison,Derived Class,除了简化的泛型算法外,模板相对于类层次结构有什么好处吗?例如,在类层次结构上使用模板是否更有效?模板在金融工具方面受到程序员的高度赞扬,但我真的不明白为什么。当速度是必需的时候,我们使用模板而不是运行时动态多态性,并且模板可能提供编译时多态性(在编译时解决),而没有虚拟方法查找开销 发件人: 是一种通用的标准编程工具,其中 对象可以用作其基础对象的实例,但 将调用派生对象的方法,其中 虚拟方法将是那些派生最多的类。这 动态多态行为(通常)由 为具有虚拟方法的类创建, 在运行时遍历以标识要访问的方

除了简化的泛型算法外,模板相对于类层次结构有什么好处吗?例如,在类层次结构上使用模板是否更有效?模板在金融工具方面受到程序员的高度赞扬,但我真的不明白为什么。

当速度是必需的时候,我们使用模板而不是运行时动态多态性,并且模板可能提供编译时多态性(在编译时解决),而没有虚拟方法查找开销

发件人:

是一种通用的标准编程工具,其中 对象可以用作其基础对象的实例,但 将调用派生对象的方法,其中 虚拟方法将是那些派生最多的类。这 动态多态行为(通常)由 为具有虚拟方法的类创建, 在运行时遍历以标识要访问的方法的表 调用。因此,运行时多态性必然需要执行 开销(尽管在现代建筑中,开销可以忽略不计)。 然而,在许多情况下,所需的多态性行为是不变的 并且可以在编译时确定。然后可以使用, 这是对编程代码中多态性的模仿,但是 在编译时解析,因此不需要运行时 虚拟表查找


另一个例子是模板在编译时计算的能力,例如众所周知的factorial,通常是这样写的

unsigned int factorial(unsigned int n) {
  return (n==0)? 1 : n * factorial(n-1); 
}

const int x = factorial(4); // == (4 * 3 * 2 * 1 * 1) == 24
const int y = factorial(0); // == 0! == 1 
将在运行时计算。但是使用模板编写

template <int N>
struct Factorial {
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> {
    enum { value = 1 };
};

// Factorial<4>::value == 24
// Factorial<0>::value == 1
const int x = Factorial<4>::value; // == 24
const int y = Factorial<0>::value; // == 1
模板
结构阶乘{
枚举{value=N*阶乘::值};
};
模板
结构阶乘{
枚举{值=1};
};
//阶乘::值==24
//阶乘::值==1
常量int x=阶乘::值;//==24
常量int y=阶乘::值;//==1.

是在编译时计算的,不会产生运行时开销。

当速度是必需的时,我们使用模板而不是运行时动态多态性,并且模板可能提供编译时多态性(在编译时解决),而没有虚拟方法查找开销

发件人:

是一种通用的标准编程工具,其中 对象可以用作其基础对象的实例,但 将调用派生对象的方法,其中 虚拟方法将是那些派生最多的类。这 动态多态行为(通常)由 为具有虚拟方法的类创建, 在运行时遍历以标识要访问的方法的表 调用。因此,运行时多态性必然需要执行 开销(尽管在现代建筑中,开销可以忽略不计)。 然而,在许多情况下,所需的多态性行为是不变的 并且可以在编译时确定。然后可以使用, 这是对编程代码中多态性的模仿,但是 在编译时解析,因此不需要运行时 虚拟表查找


另一个例子是模板在编译时计算的能力,例如众所周知的factorial,通常是这样写的

unsigned int factorial(unsigned int n) {
  return (n==0)? 1 : n * factorial(n-1); 
}

const int x = factorial(4); // == (4 * 3 * 2 * 1 * 1) == 24
const int y = factorial(0); // == 0! == 1 
将在运行时计算。但是使用模板编写

template <int N>
struct Factorial {
    enum { value = N * Factorial<N - 1>::value };
};

template <>
struct Factorial<0> {
    enum { value = 1 };
};

// Factorial<4>::value == 24
// Factorial<0>::value == 1
const int x = Factorial<4>::value; // == 24
const int y = Factorial<0>::value; // == 1
模板
结构阶乘{
枚举{value=N*阶乘::值};
};
模板
结构阶乘{
枚举{值=1};
};
//阶乘::值==24
//阶乘::值==1
常量int x=阶乘::值;//==24
常量int y=阶乘::值;//==1.

在编译时计算,不会产生运行时开销。

模板与类层次结构

主要问题是虚拟函数调用的成本。如果函数的实际工作的计算成本很小,那么虚拟调度的成本可能很大。与内联函数相比,如果在紧循环中使用,情况尤其如此。 使用运行时多态性排除了函数内联的可能性

C++模板是一个非常强大的工具……

随着C++ C++标准库中已知的通用容器和算法的出现,C++模板支持一系列高级技术,如:


本质上,您正在对编译器进行编程,以构建所需的类。如果使用得当,这可以提供高度可重用的最佳代码。如果使用不当,它可能会产生比更合适的方法更臃肿的目标代码

模板与类层次结构

主要问题是虚拟函数调用的成本。如果函数的实际工作的计算成本很小,那么虚拟调度的成本可能很大。与内联函数相比,如果在紧循环中使用,情况尤其如此。 使用运行时多态性排除了函数内联的可能性

C++模板是一个非常强大的工具……

随着C++ C++标准库中已知的通用容器和算法的出现,C++模板支持一系列高级技术,如:


本质上,您正在对编译器进行编程,以构建所需的类。如果使用得当,这可以提供高度可重用的最佳代码。如果使用不当,它可能会产生比更合适的方法更臃肿的目标代码

嗯,你能举个例子说明你不确定该用什么吗?一般来说,模板和派生类是完全不同的东西,尽管它们有很大的重叠。我不太明白你想要比较什么。如何用(单个)模板类替换类层次结构?模板类和类层次结构是完全不同的工具,用于实现不同的目标。