gpt4 book ai didi

c++ - 使用带有is_class 的std::conditional,获得编译错误

转载 作者:行者123 更新时间:2023-12-02 09:49:25 25 4
gpt4 key购买 nike

我想有一个类型,它依赖于其他具有X::value_type的类X。
如果在另一个类中没有这样的typedef,我只想单独使用X。

所以我正在寻找类似的代码:

TypeChecker<X>::value_type  // Here, value_type might be X or X::value_type, depending on X.

但是我的最初尝试失败了,请参见下文:

这是一个无法编译的程序:
#include<type_traits>

template<typename T>
struct TypeChecker {
typedef typename std::conditional<
std::is_class<T>::value,
typename T::value_type, // I believe the error is due to this line (could be wrong)
T>::type value_type;
};

int main()
{
TypeChecker<int>::value_type x = 3;

return 0;
}

它给出: error: 'int' is not a class, struct, or union type
您可以在线尝试: godbolt link

我很困惑,因为我认为 std::conditional会选择正确的分支,但是从某种意义上讲,它似乎正在评估这两个分支。至少足以引起编译错误。

救命?

最佳答案

问题是T::value_type作为模板参数传递给std::conditional,当Tint时,表达式本身无效。

您可以使用类模板和部分特化来实现。

template<typename T, typename = void>
struct TypeChecker {
typedef T value_type;
};
template<typename T>
struct TypeChecker<T, typename std::enable_if<std::is_class<T>::value>::type> {
typedef typename T::value_type value_type;
};

顺便说一句: std::is_class似乎很宽松。您可以将其限制为成员类型为 value_type,例如
template<typename T, typename = void>
struct TypeChecker {
typedef T value_type;
};
template<typename T>
struct TypeChecker<T, std::void_t<typename T::value_type>> {
typedef typename T::value_type value_type;
};

关于c++ - 使用带有is_class <int>的std::conditional,获得编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61493162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com