【问题标题】:Casting boost::fusion::vector施放 boost::fusion::vector
【发布时间】:2012-12-21 10:45:26
【问题描述】:

boost::fusion::vector 的编号形式看起来像

template <class T1>
class vector1; 

template<class T1, class T2>
class vector2; 

等等

可变参数形式看起来像

template<class T1 = boost::fusion::void_, class T2 = boost::fusion::void_>
class vector;

那么有没有办法在编译时将 boost::fusion::vector 从编号形式转换为可变参数形式?

【问题讨论】:

  • 你试过reinterpret_cast&lt;&gt; 吗?顺便说一句,“可变参数”形式不是可变参数 ...
  • 我需要编译时转换
  • static_cast&lt;&gt;const_cast&lt;&gt;reinterpret_cast&lt;&gt; 是编译时的。 dynamic_cast&lt;&gt; 不是。

标签: c++ boost boost-fusion


【解决方案1】:

你真的需要编译时转换吗?两者之间存在运行时转换,所以我看不出有必要:

vector2<int, char> a(13, 'b');
vector<int, char> b = a;

不过我试着玩玩。我对我的回答不满意,但也许你可以努力寻找更好的答案。

我希望能够使用一些元功能,但这似乎超出了我的能力范围。此外,使用这种方法,您需要根据不同的值多次定义它。

也许更好的解决方案是首先转换为元组......

#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/container/vector/vector10.hpp>
#include <boost/fusion/include/at.hpp>
#include <boost/type_traits/remove_reference.hpp>
using namespace boost::fusion;

template<typename NumVec2>
struct cast {
    typedef typename result_of::at_c<NumVec2, 0>::type T1;
    typedef typename result_of::at_c<NumVec2, 1>::type T2;
    typedef vector<typename boost::remove_reference<T1>::type, typename boost::remove_reference<T2>::type > type;
};

int main(int, char**){
    vector2<int, char> a(13, 'b');
    typedef cast< vector2<int,char> >::type casted_t;
    casted_t other(10, 'f');
}

【讨论】:

  • 是的。 Boost::fusion 有 boost::fusion::result_of::as_vector 元函数,它返回 boost::fusion::vector 的编号形式,它的工作原理和你说的完全一样。它定义了 0 到 50 个元素。所以现在我需要写这么大的代码。但我希望那一定会更好。
【解决方案2】:

看来我有答案了

using numbered_vector = fusion::vector3<int, char, float>

   struct as_vvector
    {
        template <class T>
        class result;

        template <class Self, class ... Args>
        struct result <Self(Args...)> {
            using type = fusion::vector<
                typename std::remove_reference<Args>::type...>;
        };
    };

    using variadic_vector =
        typename fusion::result_of::invoke<
                    as_vvector, numbered_vector>::type;

【讨论】:

    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多