【问题标题】:template method specialization for ptr to struct and vector of ptr to struct?ptr 到 struct 和 ptr 到 struct 的向量的模板方法特化?
【发布时间】:2013-05-13 00:44:25
【问题描述】:

如果我有一个包含两种类型的变体——指向结构的指针和指向结构的指针向量。如何专门化 boost::static_visitor 中的两个模板方法来处理这两种情况?

    boost::variant<a*,b*,c*,vector<a*>*, vector<b*>*, vector<c*>*>

【问题讨论】:

  • 什么是static_visitor
  • 我的意思是 boost::static_visitor。 boost.org/doc/libs/1_35_0/doc/html/boost/static_visitor.html
  • 你试过什么?简短的版本是“容易”,但我不知道是什么阻碍了你。是a bc 具体类,还是占位符?您希望访问者做什么?
  • 哦,您希望访问者返回什么? void?
  • @Yakk 是的,返回无效

标签: c++ boost metaprogramming


【解决方案1】:

让您的访问者函子从static_visitor&lt;void&gt; 继承,或者只是从typedef void result_type 继承。然后为您的variant 中的每种类型覆盖 —— 这可以通过模板或显式覆盖。

struct my_visitor: static_visitor<void> {
  void operator()( a* ) const {
    std::cout << "I see an a*\n";
  }
  void operator()( b* ) const {
    std::cout << "I see a b*\n";
  }
  void operator()( c* ) const {
    std::cout << "I see a c*\n";
  }
  void operator()( std::vector<c*>* ) const {
    std::cout << "I see a std::vector<c*>*\n";
  }
  void operator()( std::vector<b*>* ) const {
    std::cout << "I see a std::vector<b*>*\n";
  }
  void operator()( std::vector<a*>* ) const {
    std::cout << "I see a std::vector<a*>*\n";
  }
};

顺便说一句,将原始指针存储在boost::variant 中似乎是个坏主意——我想存储智能指针或对象的实例。类似于存储指向std::vector 的指针。有存储原始指针的用例,但它们并不常见。

一个boost::variant&lt; a, b, c, std::vector&lt;a&gt;, std::vector&lt;b&gt;, std::vector&lt;c&gt; &gt;,或者如果你的类型是多态接口,std::shared_ptr 相同(最后我检查了boost::variant 没有移动感知,所以std::unique_ptr 不能很好地工作)。

想象一下,如果您只想忽略 std::vector 实例; 结构 my_visitor: static_visitor { 无效运算符()(一*)常量{ std::cout

// container traits class, detects if `std::begin` and `std::end` work on an instance of the data:
template<typename C, bool=true>
struct is_container:std::false_type {};
template<typename C>
struct is_container<C, std::is_same< std::begin(std::declval<C&>()), std::end(std::declval<C&>()) >::value>:
  std::true_type
{};


struct my_visitor: boost::static_visitor<void> {
  // blah blah blah

  // SFINAE detection of C being a container:
  template<typename C>
  typename std::enable_if< is_container<C>::value >::type operator()( C* ) const {
    std::cout << "I see a Container<?>*\n";
  }
};

在 C++11 编译器中。

【讨论】:

  • 是否可以让模板方法专门用于“指向结构的指针”或您建议的“指向结构的shared_ptr”?
  • 当然,但是如果您没有类型,您将如何对这些未知类型的数据进行?您只是想忽略std::vector&lt;T*&gt;* 参数,还是不在乎T 的类型是什么?
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
相关资源
最近更新 更多