【问题标题】:implementation of traits with stl containers使用 stl 容器实现特征
【发布时间】:2015-07-17 13:30:06
【问题描述】:

我有一个关于使用 stl 容器实现特征的问题。

我有一些代码可以处理不同的对象(在我的例子中是张量),我无法直接访问张量类(例如,当我使用外部张量库时)。我试图通过特征来实现张量的所有必要属性。

例如,我有一个应该与张量一起使用的模板类:

template<typename Traits>
class Operator{
  typedef typename Traits::state_t state_t;
  .........
};

这意味着对于特定的张量类型,我应该指定它自己的特征类型。例如SomeTensor 我愿意:

class SomeTensorTraits{
  typedef SomeTensor state_t;
  .........
};

当我想使用其他张量类型时,我只需编写另一个特征:

class OtherTensorTraits{
  typedef OtherTensor state_t;
  .........
};

然后我在同一 Operator 代码中使用不同的张量类型,它工作正常。

当我想为某个 stl 容器(例如 std::vector)收集不同的张量时,问题就开始了。我提醒您,我无权访问张量类(因此我无法从某些基类派生张量),我也不想在容器中收集 TensorTraits

因此问题是如何通过在辅助特征中实现张量来收集不同的Tensor 对象?

感谢您的帮助。

【问题讨论】:

  • 您是在问如何将不同类型存储在同一个向量中?没用。
  • 也许boost::variant&lt;SomeTensor,OtherTensor,etc&gt;;
  • 感谢您的回答。不,我不问如何在向量中存储不同的类型。我问如何编写一些包装器或技巧如何在没有直接访问类型的情况下避免它。使用 boost::variant 是不行的,因为在这种情况下,通过添加新的张量类型,你应该用容器重写类。

标签: c++ stl containers traits


【解决方案1】:

您可以使用boost::any 来封装对象。 其他方式(更脏)是使用涵盖所有情况的联合。

您也可以创建IOperator 类,从它派生并使用vector&lt;IOperator&amp;&gt; 来存储引用。

【讨论】:

  • 感谢您的回答。当然,我不想涵盖所有情况。所以我需要一些将军。我也不想使用 boost,因为我将使用我的代码作为更通用数学库的一部分,并且它不使用 boost。但是您的参考想法看起来很棒。你能详细解释一下吗?
  • 您可以这样定义您的 Operator 类:template&lt;typename Traits&gt; class Operator : public IOperator{ ... }。您还可以使用要访问的公共纯虚拟方法定义 IOperator 类,并在 Operator 类中定义重载这些纯虚拟方法的方法。请记住,向量将存储引用,因此对象必须具有容器的生命周期。可能动态分配和std::share_ptr会更好。
  • 但我不想收集不同的运算符。我想收集张量。如果我在任何情况下都使用对张量的引用,那么不同类型就会出现问题。只是因为引用类也定义为code template/code。或者可能是我不明白你的想法。
  • 你需要在这个模板类之上创建一个具有通用接口的基类。然后,您可以将这些基础的引用存储在向量中。此外,您的操作员代码应该与基类提供的接口进行交互。
【解决方案2】:

我认为您想要具有专业化的通用特征:

template<typename T>
struct TensorTraits;

template<>
struct TensorTraits<SomeTensor>;
{
    using state_t = SomeTensor;
    // ...
};

template<>
struct TensorTraits<OtherTensor>
{
    using state_t = OtherTensor state_t;
};

【讨论】:

  • 感谢您的回答。那么如何将Tensors 存储在容器中?我实际上想编写一些负责它的类。像这样:class Collect{ std::vector&lt;?&gt; coll;};。你能详细介绍一下你的想法吗?
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 2021-11-14
  • 2014-11-04
  • 1970-01-01
相关资源
最近更新 更多