Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使这个std::conditional不基于类型计算表达式?_C++_Templates - Fatal编程技术网

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);