Этот код компилируется на моей машине с 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");
Это должно быть вполне эквивалентното, что вы описываете.
В следующем предложении Клинтона реализовано:
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);
}
Для этого вам нужны только <memory>
и <type_traits>
, и вы получите идеальную переадресацию и правильное поведение для целочисленного продвижения.