2017-02-17 19 views
1

私は引数としてvector<specific_type>をとり、vector<boost::variant<specific_type, ...>>を引数として持つ関数シグネチャを持っています。引数の単純な転送は機能しません。私は唯一の解決策として再梱包を発見しましたが、これはおそらく最も性能の高い解決策ではありません。何とか簡単なキャストは可能ですか?ベクトル<specific_type>をベクトルにキャストする<boost :: variant>

最小例:

#include "boost/variant.hpp" 

#include <string> 
#include <vector> 

typedef boost::variant<int, std::string> test_t; 

void inner(std::vector<test_t> a) {} 

void outer(std::vector<int> a) { 
    // the following does not work: 
    //inner(a); 
    //inner((std::vector<test_t>) a); 
    //inner(const_cast<std::vector<test_t>>(a)); 
    //inner(reinterpret_cast<std::vector<test_t>>(a)); 
    //inner(static_cast<std::vector<test_t>>(a)); 
    //inner(dynamic_cast<std::vector<test_t>>(a)); 

    // only "valid" solution 
    std::vector<test_t> b; 
    for (const int i : a) { 
     b.push_back(i); 
    } 
    inner(b); 
} 

int main() 
{ 
    std::vector<int> a = { 1, 4, 2 }; 
    outer(a); 
} 

答えて

3

は、単純なキャストが可能何とかますか?

いいえ。そのようなキャストはありません。

が、これは我々が使用して少し良く行うことができますが、ない最もパフォーマンスの高いソリューション

正しい可能性がありvector range constructor:我々は次のように使用することになり

template< class InputIt > 
vector(InputIt first, InputIt last, 
     const Allocator& alloc = Allocator()); 

void outer(std::vector<int> const& a) { 
    inner({a.begin(), a.end()}); 
} 
+0

これは、メモリの余分な割り当てを回避しますが、完全なベクトルも反復しますか?もちろん、構文はかなり良いです。 – gerion

+0

@gerionその周りには道はありません。それぞれの要素に対して 'variant'を構築しなければなりません。実際にはすべての要素を見ずにはできません。 – Barry

+0

@gerion、少なくともオブジェクトをバリアントベクトルに移動できますか? –

関連する問題