为什么此模板定义了一组匹配void的别名类型

Why is this template defining a set of aliased types matching void?

本文关键字:一组 void 类型 别名 定义 为什么      更新时间:2023-10-16

我正在用模板函数包装变体的get函数,该函数返回在混叠类型的结构中定义的类型。我应该能够在模板中输入混叠型类型,并使函数返回该类型的值,但是,该类型无法匹配并返回" void"。为什么是这样?

#include <iostream>
#include <type_traits>
#include <utility>
#include <string>
#include <variant>
using namespace std;
struct Type
{
    using String = std::string;
    using Int = int;
};
template<typename T>
using TType = enable_if_t<
    is_same<T, Type::String>::value ||
    is_same<T, Type::Int>::value
>;
template<typename T> TType<T> getValue(variant<Type::String, Type::Int> const& value)
{
    return get<T>(value);
}
int main()
{
    variant<Type::String, Type::Int> value = "";
    cout << getValue<Type::String>(value) << endl;
}

enable_if_t采用两个参数。第二个是将启用的类型,默认情况下是void。将您的TType声明更改为

template<typename T>
using TType = enable_if_t<
    is_same<T, Type::String>::value ||
    is_same<T, Type::Int>::value,
    T
>;

(您的病情后添加, T(。