C ++,将向量<specific_type>强制转换为向量<boost :: variant>

时间:2017-02-17 21:45:50

标签: c++ vector boost boost-variant

我有一个函数签名,它以vector<specific_type>为参数,并调用另一个以vector<boost::variant<specific_type, ...>>为参数的函数。简单的参数转移不起作用。我发现重新包装只是解决方案,但这可能不是最有效的解决方案。某种简单的演员有可能吗?

最小例子:

#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);
}

1 个答案:

答案 0 :(得分:4)

  

是否可以以某种方式进行简单演员?

不。没有这样的演员。

  

这可能不是最高效的解决方案

正确,我们可以使用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()});
}