2012-12-21 52 views
4

編號的boost ::融合::載體的形式看起來像鑄造的boost ::融合:: 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?

+0

你嘗試了'的reinterpret_cast <>'?順便說一下,「variadic」形式不是可變參數... – Walter

+0

我需要編譯時鑄件 – Andigor

+0

'static_cast <>','const_cast <>'和'reinterpret_cast <>'是編譯時。 'dynamic_cast <>'不是。 – Walter

回答

2

您是否確實需要編譯時間轉換?有兩間運行時轉換,所以我真的不能看到需要:

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'); 
} 
+0

是的。 Boost :: fusion具有boost :: fusion :: result_of :: as_vector元函數,它返回boost :: fusion :: vector的編號形式,它的工作原理與您所說的完全相同。它定義了從0到50個元素。所以現在我需要編寫這麼大的一段代碼。但我希望這一定更好。 – Andigor

0

如此看來,我有一個答案

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;