加速变体:绑定顺序中是否有魔力

Boost Variant: Is there magic in the binding order?

本文关键字:是否 有魔力 定顺序 绑定 加速      更新时间:2023-10-16

我一直在阅读我能找到的关于Boost Variant的所有内容。 (我头疼。有些人惊讶于分配字符串文字被保存为布尔值。 如果我在bool之前(之后?)列出char*,字符串文字会保存为char*字符串吗? v1v2之间的排序在这里重要吗?

boost::variant<char*, bool> v1 = "hello";
boost::variant<bool, char*> v2 = "hello";
对于整数,

我应该简单地为所有整数绑定最大的整数,还是应该单独绑定int8_tint64_t? 如果我将它们全部绑定,然后输入一个,适合其中任何一个,它是否会保存为第一个(最后一个?

floatdouble怎么样?

没有魔法。

只有构造函数的记录行为。

template<typename T> variant(T & operand);

要求:T 必须明确可转换为有界类型之一(即 T1、T2 等)。

后置条件:内容 *这是操作数到有界类型之一的最佳转换,由标准重载解析规则确定。

抛出:可能会失败,并且由于将操作数转换为有界类型之一而出现任何异常。

由于这两种情况都涉及隐式转换,因此可能会构造意外的元素类型。

请参阅以下示例

住在科里鲁

#include <boost/variant.hpp>
int main() {
    {
        boost::variant<bool, std::string> v;
        v = "hello"; // is char const(&)[6], converts to bool
        assert(0 == v.which());
        v = static_cast<char const*>("hello");
        assert(0 == v.which());
    }
    // compare to
    {
        boost::variant<bool, char const*> v;
        v = "hello"; // is char const(&)[6]
        assert(1 == v.which()); // now selects the direct match
        v = static_cast<char const*>("hello");
        assert(1 == v.which());
    }
}