ptr到struct的模板方法专门化和ptr到struct的向量?

时间:2013-05-13 00:44:26

标签: c++ boost metaprogramming

如果我有一个变量包含两个类型 - 指向struct的指针,以及指向struct的指针的向量。我如何专门设计boost :: static_visitor中的两个模板方法来处理这两种情况?

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

1 个答案:

答案 0 :(得分: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";
  }
};

顺便说一句,将原始指针存储在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&lt;&lt; “我看到一个* \ n”;       }       void operator()(b *)const {         std :: cout&lt;&lt; “我看到了一个b * \ n”;       }       void operator()(c *)const {         std :: cout&lt;&lt; “我看到了一个c * \ n”;       }       模板       void operator()(std :: vector *)const {         std :: cout&lt;&lt; “我看到一个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编译器中。