gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:02 24 4
gpt4 key购买 nike

我正在学习 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 tuple implementation(解决了类似的问题)。主要思想是您可以为 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();
}
}

如果你想要“高科技”,你可以试试名为 Variadic Templates 的 C++11 标准特性。 .但请确保您所针对的编译器已经支持此功能。

最好的问候,马尔辛

关于C++ boost MPL : how to get rid of vector and callnot internal function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8322619/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com