在C++ 0x中创建一个静态类型的变体

Gha*_*uni 0 c++ variant template-meta-programming c++11

我想知道,如果在C++ 0x中有可能创建一个静态类型的变体,(表现得像auto):

variant<int, bool, std::string> v = 45;
Run Code Online (Sandbox Code Playgroud)

当我们将v赋值给int以外的值时,它不会编译:

v = true; //Compile error
Run Code Online (Sandbox Code Playgroud)

到目前为止,我没有找到任何优雅的解决方案

fil*_*mor 6

这段代码在我的机器上用Boost.Variant编译,g ++ 4.5用于C++ 98和C++ 0x.你想自己实现变体类型吗?然后您可以查看Boost实现.

如果您想要/ get /上述行为,您可以这样做:

auto v = 45;
static_assert(std::is_same<decltype(v), bool>
              || std::is_same<decltype(v), int>
              || std::is_same<decltype(v), std::string>,
              "v must be int, bool or string");
Run Code Online (Sandbox Code Playgroud)

这应该与你描述的完全相同.

以下实现克林顿的建议:

template <typename T, typename... Args>
struct has_type;

template <typename T, typename Head, typename... Args>
struct has_type<T, Head, Args...>
{
    static const bool value = std::is_same<T, Head>::value
                              || has_type<T, Args...>::value;
};

template <typename T>
struct has_type<T> : std::false_type
{};

template <typename... Args, typename T>
T&& check_type (T&& t)
{
    static_assert(has_type<T, Args...>::value, "check_type");
    return std::move(t);
}
Run Code Online (Sandbox Code Playgroud)

您只需要<memory><type_traits>为此获得完整的转发和正确的整数提升行为.