【问题标题】:Specifying template arguments from variables in C++从 C++ 中的变量指定模板参数
【发布时间】:2012-01-25 02:44:45
【问题描述】:

我想用运行时变量中可用的数据类型来实例化一个模板类。例如,考虑这个类:

template <typename T, unsigned int U>
class Allocator
{
public:
    T * pointer;
    Allocator() { pointer = new T[U]; }
    ~Allocator() { delete [] pointer; }
};

现在我想这样使用它:

int main()
{
    string temp = "int";
    unsigned int count = 64;
    Allocator<temp, count> a;
    return 0;
}

有什么办法吗?

我在使用基指针序列化派生类的上下文中遇到了这个问题。我使用RTTI来识别派生类的真实类型,但是真实类型的信息存储在一个字符串中。我的问题是能够从基指针动态转换为类型(在运行时作为字符串可用)。请帮忙。

【问题讨论】:

  • U 必须是模板参数而不是构造函数中的参数有什么原因吗?
  • 以上只是手头实际问题的一个例子。虽然这可以通过在这种特殊情况下使 U 成为构造函数参数来轻松解决,但我以这个为例来解决真正的问题......

标签: c++ templates rtti


【解决方案1】:

由于 C++ 中缺乏反射机制,因此几乎不可能基于具有直接语言支持的数据进行“动态创建”。

唯一的方法是使用“开关”或任何等效的声明机制,例如拥有一个调度映射的工厂类,它将声明类型的字符串与创建函数调用相关联。

【讨论】:

  • 这也是我一直在考虑的问题(请参阅我对 Drewen 回答的评论)。但问题是,对于给定的数据类型,比如int,我必须将所有可能大小的分配器的指针存储到映射中。希望有一种方法可以自动化...
  • 意思是,有一个map,它存储int作为key,另一个map作为它的value。在第二个(值)映射中,键是大小(比如 64),值是指向实际分配器的指针(Allocator&lt;int, 64&gt; *)。现在很容易克隆......另一方面是,第二个(值)映射必须具有所有可能大小的分配器指针(或至少,程序中使用的可能大小)。
  • @Somesh:我觉得有点太复杂了,但在语义上是等价的。它只不过是一个(更清晰的)声明性结构。如果它让你感觉更舒服......为什么不呢!
【解决方案2】:

你不能。数据类型必须在编译时知道。也许使用 Boost 或 unions 可能会以不漂亮的方式解决问题。

祝你好运!

【讨论】:

  • 我设法想到的一种方法是使用类似于原型模式的东西。如果存在所有可能类型的分配器(实际在应用程序中使用)的查找表,那么它可以使用作为字符串可用的数据类型(表的“键”)并“克隆”适当的分配器(指向表中键的“值”的指针)。但是,使用这种方法,我仍然需要注册 Allocator&lt;int, XXX&gt; 的指针,其中 XXX 会扫描所有可能的大小,一次一个值。有什么办法可以避免这种情况?
  • 好的,经过更多思考,我现在可以理解为什么这个不能完成了。原因是基于模板的代码生成是编译时活动。编译器在编译时不知道变量的内容,因此无法确定在模板实例化时要生成什么代码。非常感谢大家的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2014-06-20
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多