【发布时间】:2014-04-30 15:36:19
【问题描述】:
假设我有一个像 int arr[N] 这样的 int 数组,并且说 arr[i] 来自一个很小的域(例如 1-10)。假设我还有一个带有通用接口的可变参数模板类(抽象类)
template <int... A>
class FooImpl : public Foo
{
}
问题是如何实现一个函数:
Foo* getFoo(int arr[N]);
或者更好:
Foo* getFoo(int* pint, int size);
哪个会返回FooImpl,模板参数对应我的数组?例如arr = {4,2,6,1} 我会得到FooImpl<4,2,6,1>
【问题讨论】:
-
如果您想知道如何在运行时提供模板参数(一个编译时的东西)返回
FooImpl,你不能。您可以为两者使用类似的初始化程序,但运行时数据评估不能产生编译时实现。 -
我很确定我可以。在最坏的情况下,我可以简单地枚举所有大小 = 1、2 等的案例......大小 = 1 有 10 个案例,大小 = 2 有 100 个案例等等。请注意,所有这些类都具有相同的基类(即接口)Foo,并注意我的元素来自有限的集合。
-
我真的不知道你刚才说了什么,但我坚持我的意见。您无法从运行时内容推导出编译时模板参数。如果您认为您可以执行
int ar[3]; ar[0] = 1; ar[1] = 2; ar[2] = 3;之类的操作,那么以某种方式将ar发送到工厂,这将导致 FooImpl 我看到它发生的唯一方法是一个包含 1000 个条目的静态表,每个插槽静态定义为返回特定的FooImpl<a,b,c>但此时它并不是真正的运行时。你肯定不会继承它。 -
好的,我就是这么说的。我可以通过硬编码我需要的所有案例来做到这一点。直到 size = 3 我将有 1000+100+10=1110 种不同的情况,并且有那么多行代码来涵盖所有这些情况。我的问题是如何以聪明的方式使我的代码不超过 1110 行代码?
-
好吧,至少看起来我当时8确实理解你。我必须考虑一下,看看是否可以使用模板生成器模板。
标签: c++ arrays int variadic-templates non-type