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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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 - Fatal编程技术网

C++ 如何将变量参数传递给模板?

C++ 如何将变量参数传递给模板?,c++,templates,C++,Templates,我想从键盘输入参数(int),然后将其传递给模板以创建对象。模板是 int lim; cin>>lim; mpa<lim,int,const char*> C;` int-lim; cin>>lim; mpa-C` 但它需要一个常量表达式。如何实现这一行动?这是不可能的。模板在编译时实例化,您希望在运行时更改行为。 或者,如果知道一组可能的参数值,您可以在switch/case或类似结构中提及它们。 当然,当使用这种技术时,应该注意代码膨胀-模板的所有实例化都将被

我想从键盘输入参数(int),然后将其传递给模板以创建对象。模板是

int lim;

cin>>lim;

mpa<lim,int,const char*> C;`
int-lim;
cin>>lim;
mpa-C`

但它需要一个常量表达式。如何实现这一行动?

这是不可能的。模板在编译时实例化,您希望在运行时更改行为。 或者,如果知道一组可能的参数值,您可以在switch/case或类似结构中提及它们。
当然,当使用这种技术时,应该注意代码膨胀-模板的所有实例化都将被编译成二进制,所以这根本不是一种好方法,这是不可能的。模板在编译时实例化,您希望在运行时更改行为。 或者,如果知道一组可能的参数值,您可以在switch/case或类似结构中提及它们。
当然,当使用这种技术时,应该注意代码膨胀-模板的所有实例化都将编译成二进制,所以这根本不是一种好方法。

模板是编译时构造。它们在运行时不存在。I/O在运行时发生。它不能在编译时完成。由此可知,你所寻求的是不可行的。如果你解释一下你的目标是什么,也许有人可以提供一个替代方案。模板参数必须是编译时常量。这是必需的,因为编译器必须在编译时生成模板代码。模板是编译时构造。它们在运行时不存在。I/O在运行时发生。它不能在编译时完成。由此可知,你所寻求的是不可行的。如果你解释一下你的目标是什么,也许有人可以提供一个替代方案。模板参数必须是编译时常量。这是必需的,因为编译器必须在编译时生成模板代码。添加开关/大小写会破坏一个完美的答案-您应该删除它+1尽管如此,对于运行时和编译时之间的明确区别,为什么?如果用户的输入在一个已知的范围内,那么他可以使用这个范例,前提是使用模板的性能提升足以抵消这种方法的丑陋。@akappa:在这种情况下-是正确的选择,而不是一个开关和一系列case语句。它更可读、更易维护,而且在大多数情况下也更高效。@Fahrenheit2539:不,你不会的-你必须填充
映射(在程序生命周期内只填充一次)并调用
映射[lim]。build()
每个
抽象工厂
实现类都有一个覆盖方法
build()
将返回一个超类
mpa
。实现方法将返回特定的
mpa
object@akappa:我认为这是我们可以简单地同意不同意的地方之一:)开关/案例的添加破坏了一个完美的答案-你应该删除它+1尽管如此,对于运行时和编译时之间的明确区别,为什么?如果用户的输入在一个已知的范围内,那么他可以使用这个范例,前提是使用模板的性能提升足以抵消这种方法的丑陋。@akappa:在这种情况下-是正确的选择,而不是一个开关和一系列case语句。它更可读、更易维护,而且在大多数情况下也更高效。@Fahrenheit2539:不,你不会的-你必须填充
映射(在程序生命周期内只填充一次)并调用
映射[lim]。build()
每个
抽象工厂
实现类都有一个覆盖方法
build()
将返回一个超类
mpa
。实现方法将返回特定的
mpa
object@akappa:我认为这是我们可以同意不同意的地方之一:)