gpt4 book ai didi

C++ boost::variant 泛型转换器

转载 作者:行者123 更新时间:2023-11-28 06:55:18 25 4
gpt4 key购买 nike

过去三天我一直在尝试弄清楚如何实现一种从 boost::variant<...> 中获取值的通用方法,但这非常困难。

这是我能想到的解决方案,它一点也不通用:

#include <iostream>
#include "boost\variant\variant.hpp"

using MyVariant = boost::variant<int, std::string>;

class VariantConverter : public boost::static_visitor<>
{
private:
mutable int _int;
mutable std::string _string;

static VariantConverter apply(MyVariant& v)
{
VariantConverter res;

v.apply_visitor(res);

return res; // copy will be elided, right?
}

public:
void operator()(int& i) const
{
_int = i;
}

void operator() (std::string& s) const
{
_string = s;
}

static int to_int(MyVariant v)
{
return apply(v).from_int();
}

static std::string to_string(MyVariant v)
{
return apply(v).from_string();
}

int from_int()
{
return _int;
};

std::string from_string()
{
return _string;
};
};

int main()
{
using namespace std;

MyVariant v = 23;

int i = VariantConverter::to_int(v);

cout << i << endl;

v = "Michael Jordan";

std::string s = VariantConverter::to_string(v);

cout << s.c_str() << endl;

cin.get();

return 0;
}

如果有人能指导我找到更好的解决方案,我将不胜感激。

或者也许有人可以向我解释这背后的基本原理:

如果我声明:

using MyVariant = boost::variant<int, std::string>;

然后是:

ConverterToInt : basic_visitor<int> {
public:
int operator() (int i) { return i; };
};

为什么当我尝试将 ConverterToInt 应用到 MyVariant 时:

ConverterToInt cti;

MyVariant i = 10;

i.apply_visitor(cti);

我在尝试查找采用 std::string 的 operator() 时遇到编译器错误?

在我看来,apply_visitor 正在尝试为 MyVariant 可以采用的每种类型调用一个 operator()。是这样吗?如果是,为什么?我怎样才能避免这种行为?

干杯!

最佳答案

您可以通过告诉 ConverterToInt 如何处理 std::string 来避免错误消息。您可能知道 i 不能是 std::string 但期望编译器知道这一点是不合理的(如果是这样,您为什么要使用变体?)。

apply_visitor 只会调用正确的 operator() 方法,但它在运行时决定,编译器需要涵盖所有可能性才能生成代码。

关于C++ boost::variant 泛型转换器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23257772/

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