【问题标题】:How to put values of different template argument value but same type in variable of this type? C++如何将不同模板参数值但相同类型的值放入此类型的变量中? C++
【发布时间】:2019-10-01 17:35:15
【问题描述】:

我有一个类型的值,但模板参数不同。我想要一些变量来存储所有这些值。

例如。我有一个带有模板的课程A

template <typename T>
class A
{
}

我有一堆 A 类型的值,但模板参数不同:

A<int> aIntVar;
A<char> aCharVar;
A<bool> aBoolVar;

所以我希望能够将指向它们中的每一个的指针放在

std::vector< /*pointer to some type that can store values above*/ > vectorOfAValues;

像这样:

vectorOfAValues.emplace_back(&aIntVar);
vectorOfAValues.emplace_back(&aCharVar);
vectorOfAValues.emplace_back(&aBoolVar);

但我不能,因为这些值的类型与其无模板参数类型不具有多态性。

粗略地说,我想在由一种类型但具有不同模板参数的类型家族之间建立多态性。

【问题讨论】:

  • “我有一堆 A 类型的值” - 你有一堆不同的、不相关类型的值 A&lt;int&gt;A&lt;char&gt;A&lt;bool&gt;。指向它们的指针也是不同的不相关类型。 std::vector 是同构容器,即所有存储的值必须具有相同的类型。因此不可能将这些值或指向它们的指针存储在单个向量中。

标签: c++ templates inheritance polymorphism


【解决方案1】:

你可以使用

struct BaseA { ... };

template <typeaname T> class A : public BaseA { ... };

但是你将不得不存储指向BaseA 的指针,最好是智能指针。

std::vector<std::shared_ptr<BaseA>> vectorOfAValues;

std::vector<std::unique_ptr<BaseA>> vectorOfAValues;

【讨论】:

  • 这很好,但真正的问题不应该是我们为什么要从不相关类型的集合开始?
  • @cplusplusrat,对此的需求是公认的。这就是为什么你有std::anystd::variant
  • 在收藏中?你有什么可以指出的参考吗?我想更好地理解用例。
  • @cplusplusrat,在我的领域,CAD 和 CAE 中,拥有可以包含浮点数、枚举、整数值、布尔值和字符串的网格控件和模拟控件的集合是很常见的。
  • @cplusplusrat OP:“我想在类型家族中实现多态性”。是不是因为Base 看起来相当空虚而让你感到不安?当然,这些类型的任何共同点都应该放在Base
【解决方案2】:

在 C++ 17 上,您可以使用

std::any

#include <any>
#include <vector>

template<class X>
class A {}

int main(int, char**) {
   std::vector<std::any> myVec {A<char>{}, A<int>{}, A<float>{}};
   return 0;
}

或带指针

...
std::any anyA = A<int>{};
std::any anyB = A<float>{};

std::vector<std::any*> a{&anyA, &anyB};

【讨论】:

    猜你喜欢
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多