这个问题与我最近提出的这个问题 ([ Accessing a method from a templated derived class without using virtual functions in c++?) 略有不同。
我想使用模板化工厂方法创建一个对象的实例,然后从那时起只能根据提供给该项目的初始类型设置和获取一个值。
这是我正在努力实现的一个简单示例:
boost::shared_ptr<Item> item = Item::create<float>();
item->setValue(5); // conversion to 5.0 in setting the value
float value = item->value(); // returned value = 5.0
基本上,setValue 唯一会失败的情况是,如果没有从提供的任何内容到 Item 中内部值的初始“类型”的隐式转换。
因此,如果我将整个 Item 类设为采用类型的模板化类,则每次我创建指向 Item 的共享指针时都需要提供值的类型,我并不真正关心这一点。
我采用的下一个方法是尝试将初始类型存储在类中,并使用 boost::any 作为内部存储,如果存在隐式转换,则将内部类型转换为指定的初始类型。然而,我努力存储和比较类型信息,最初查看 std::type_info,但由于 setValue 采取了 boost::any,无法比较实际传递的内容。
(对此的轻微扩展可能是在创建时为模板参数提供变体样式的选项列表,并以 native 提供的类型返回值。)
可能有一种我不知道的设计模式,或者我没有考虑过的不同方法,所以我有兴趣听听有关如何解决这个问题的任何建议?
最佳答案
考虑一下:
boost::shared_ptr<Item> item1 = Item::create<float>();
boost::shared_ptr<Item> item2 = Item::create<string>();
item1 和 item2 具有相同的(静态)类型:boost::shared_ptr。所以没有任何方法可以编译:
item2.setValue("foo");
编译失败:
item1.setValue("foo");
我不确定你在说什么“如果我让整个 Item 类成为一个采用类型的模板类,我每次调用 setValue 或 value (setValue
boost::shared_ptr<Item<float> > item = Item<float>::create();
然后您可以轻松地让 setValue() 方法只接受匹配的类型。
关于c++ - 将任何类型的值存储为 C++ 模板化工厂方法中最初提供的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1577084/