c++ - 将任何类型的值存储为 C++ 模板化工厂方法中最初提供的类型?

标签 c++ design-patterns templates types

这个问题与我最近提出的这个问题 ([ 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(5) )”。听起来您实际上是在谈论使每个方法模板化,而不是整个类。如果 Item 类是模板化的,那么你会写:

boost::shared_ptr<Item<float> > item = Item<float>::create();

然后您可以轻松地让 setValue() 方法只接受匹配的类型。

关于c++ - 将任何类型的值存储为 C++ 模板化工厂方法中最初提供的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1577084/

相关文章:

c++ - 无法推导模板参数

c++ - 使用预制命名空间 (C++) 的范围

c++ - 我可以仅使用加减指令来检查数字是奇数还是偶数吗?

design-patterns - 为什么在构建器模式中类成员是重复的?

c++ - 有没有办法让模板根据参数是否是模板类型和值来执行特定的操作?

c++ - 基类模板成员函数隐藏在派生类中,尽管参数列表不同

c++ - 不同大小的着色器存储缓冲区内容 "transfered"到数组缓冲区

c++ - 套接字接受无效参数 (c++)

c# - 在 MVVM 场景中,我应该如何轮询数据库表以获取 'live' View ?

asp.net-mvc - 如何在 MVC : Responsibility 中实现工作单元