为什么这个模板定义了一组匹配 void 的别名类型?
Why is this template defining a set of aliased types matching void?
我正在使用模板化函数包装变体的 get 函数 returning 在别名类型的结构中定义的类型。我应该能够将别名类型输入到模板中,并使函数 return 具有该类型的值,但相反,该类型无法匹配并且 returning '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
)。
我正在使用模板化函数包装变体的 get 函数 returning 在别名类型的结构中定义的类型。我应该能够将别名类型输入到模板中,并使函数 return 具有该类型的值,但相反,该类型无法匹配并且 returning '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
)。