c++ Boost MPL:如何摆脱vector和callnot内部函数

C++ Boost MPL: how to get rid of vector and callnot internal function?

本文关键字:vector callnot 内部函数 何摆脱 Boost MPL c++      更新时间:2023-10-16

我正在学习Boost。MPL和我才刚刚开始。如果解决方案很明显,请原谅我。我看这样的例子:

#include <boost/mpl/vector.hpp>
#include <boost/mpl/for_each.hpp>
#include <iostream>
using namespace std;
struct A
{
    template <class T>
    void    operator()(T t)
    {
        cout << typeid(T).name() << "t" << t << endl;
    }
    template <class TypeVector>
    void    FooAll(void)
    {
        boost::mpl::for_each<TypeVector>(*this);
    }
};
void main(void)
{
    A   a;
    a.FooAll<boost::mpl::vector<int, float, long>>();
}

和不禁想知道如何摆脱boost::mpl::vector时,调用FooALL(把它变成a.FooAll<int, float, long>();),并为每个参数调用一些静态/全局/或类内部函数,而不是混淆我的*this ?

请查看boost元组实现(解决类似问题)。其主要思想是,您可以为您的FollAll<…>()方法指定最大数量的模板参数,并为大多数模板参数提供默认类型。这是我脑海中的一个草图

#include <boost/type_traits/is_same.hpp>
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/push_back.hpp>
using boost::is_same;
using boost::mpl::eval_if;
using boost::mpl::vector;
using boost::mpl::push_back;
struct EmptyType {  };
struct A
{
  template<typename arg1, typename arg2=EmptyType, typename arg3=EmptyType, ..., typename argN=EmptyType>
  void    FooAll() {
      // reconstruct the type vector for easy manipulation later
      // Bolierplate code!
      typedef vector<arg>   vector_arg1;       
      typedef typename eval_if<is_same<arg2, EmptyType>,
                                vector_arg1,
                                push_back<vector_arg1, arg2> >::type  vector_arg2;
      typedef typename eval_if<is_same<arg3, EmptyType>,
                                vector_arg2,
                                push_back<vector_arg2, arg3> >::type  vector_arg3;
      //... rest of arguments
      typedef typename eval_if<is_same<argN, EmptyType>,
                                vector_arg(N-1),
                                push_back<vector_arg(N-1), argN> >::type  vector_argN;
      // now you can manipulate the reconstructed type vector
      Do_some_internal_stuff<vector_argN>::apply();
  }
}

如果你想要"高科技",你可以尝试c++ 11的一个标准特性——可变模板。但是请确保您的目标编译器已经支持此特性。

最诚挚的问候,Marcin