C++ 如何使这个std::conditional不基于类型计算表达式?
我有以下问题:C++ 如何使这个std::conditional不基于类型计算表达式?,c++,templates,C++,Templates,我有以下问题: struct MyType { int member; }; template <typename T> void func(T a) { using mytypedef = std::conditional<std::is_same_v<T, MyType>, decltype(T::member), char>; // If T is MyType I want mytypedef to be of type My
struct MyType
{
int member;
};
template <typename T>
void func(T a)
{
using mytypedef = std::conditional<std::is_same_v<T, MyType>, decltype(T::member), char>;
// If T is MyType I want mytypedef to be of type MyType::member
}
int main()
{
MyType t{};
func(t); // Works fine because 'T::member' is an identifier
func(5); // Fails, 'T::member', undeclared identifier
}
struct MyType
{
国际会员;
};
模板
无效函数(TA)
{
使用mytypedef=std::conditional;
//如果T是MyType,我希望mytypedef的类型为MyType::member
}
int main()
{
MyType t{};
func(t);//工作正常,因为't::member'是一个标识符
func(5);//失败,'T::member',未声明的标识符
}
解决此问题的方法有哪些?问题在
func
中,decltype(T::member)
被指定为std::conditional
的模板参数,并且无论T
是什么,它都必须有效
唯一的方法就是为它创造类型特征
template <typename T>
struct get_mytype {
using type = T;
};
template <>
struct get_mytype<MyType> {
using type = decltype(MyType::member);
};
模板
结构get\u mytype{
使用类型=T;
};
模板
结构get\u mytype{
使用type=decltype(MyType::member);
};
然后
模板
无效函数(TA)
{
使用mytypedef=typename get_mytype::type;
//如果T是MyType,我希望mytypedef的类型为MyType::member
}
T::member
被传递给conditional,而不管第一个bool说采用哪个分支。没有短路。如果它无效,那就是一个严重的错误
template<class T>struct has_member{T member;};
using mytypedef = decltype(std::declval<std::conditional_t<std::is_same_v<T, MyType>, T, has_member<char>>>().member);
templatestruct有_成员{T成员;};
使用mytypedef=decltype(std::declval().member);
template<class T>struct has_member{T member;};
using mytypedef = decltype(std::declval<std::conditional_t<std::is_same_v<T, MyType>, T, has_member<char>>>().member);