0

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

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

1 回答 1

0

让您的访问者函子继承自static_visitor<void>. 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";
  }
};

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

A boost::variant< a, b, c, std::vector<a>, std::vector<b>, std::vector<c> >,或者如果您的类型是多态接口,std::shared_ptr则相同(最后我检查boost::variant的不是移动感知,所以std::unique_ptr它不能很好地工作)。

想象一下,如果您只想忽略std::vector实例;struct my_visitor: static_visitor { void operator()( a* ) const { std::cout << "我看到一个 a*\n"; } void operator()( b* ) const { std::cout << "我看到 ab*\n"; } void operator()( c* ) const { std::cout << "我看到 ac*\n"; } template void operator()( std::vector* ) const { std::cout << "我看到一个 std::vector*\n"; } }; 或者,如果你想忽略所有看起来像容器的东西:

// 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 编译器中。

于 2013-05-13T03:54:28.710 回答