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)
到目前为止,我没有找到任何优雅的解决方案
这段代码在我的机器上用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>为此获得完整的转发和正确的整数提升行为.