gpt4 book ai didi

c++ - boost 变体 : how to get currently held type?

转载 作者:IT老高 更新时间:2023-10-28 14:02:03 26 4
gpt4 key购买 nike

据我了解,boost.variant 的所有类型被解析成真正的类型(意思好像 boost variant<int, string> a; a="bla-bla" 会在编译后变成 string a; a="bla-bla" )所以我想知道:如何让什么类型被放入 boost 变体?

我尝试了什么:

#include <boost/variant.hpp>
#include <boost/function.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>

int main()
{
typedef boost::function<double (double x)> func0;
typedef boost::function<double (double x, double y)> func1;
typedef boost::variant<int, func0, func1> variant_func;
func1 fn = std::plus<double>();
variant_func v(fn);
std::cout << boost::get<func1>(v)(1.0, 1.0) << std::endl; // this works
//std::cout << boost::get<v::type>(v)(1.0, 1.0) << std::endl; // this does not compile with many errors
// std::cout << (v)(1.0, 1.0) << std::endl; // this fails with Error 1 error C2064: term does not evaluate to a function taking 2 arguments

std::cin.get();
return 0;
}

最佳答案

v.which()将返回当前持有的对象类型的从 0 开始的索引。

当您检索对象时,您的代码必须使用静态类型(为了满足 get<T> 函数模板)来引用(有效)动态类型的对象。

您需要测试类型(使用 which()type() )并相应地分支或使用静态访问者。无论选择哪种方式,都必须显式声明要检索的静态类型,并且必须与动态类型匹配,否则将引发异常。

解决此问题的一种方法是,不要直接使用变体类型,而是使用内部包含变体类型的类,然后定义使用该对象所需的任何隐式转换运算符。

我有一个名为 Dynamic C++ 的项目它使用了这种技术。

关于c++ - boost 变体 : how to get currently held type?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8344080/

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