当前位置: 首页 > 知识库问答 >
问题:

std::类类型与非类类型的条件\u t

苏嘉歆
2023-03-14

如何修复此问题:

template<class T>
struct ResultType
{
    using type = std::conditional_t<std::is_class_v<T>, typename T::result_type, void>;
};

如果T不是类类型,而是:

错误:“int”不是类、结构或联合类型24 |使用类型=std::conditional\u tstd::is\u class\u v

所以我不需要尝试调用错误的表达式,但是如何调用呢?

共有3个答案

干京
2023-03-14

失败是因为选择了两个类型表达式中的一个,但此时类型表达式已经被计算过了。因为int不是一个类,并且没有result\u type,所以它是错误的。

正如其他人所指出的,这可以通过SFINAE通过启用if或void来解决,但另一种方法是利用函数重载和表达式SFINAE,而不需要部分专门化:

template <typename T, typename Default = void>
class ResultType
{
    static auto test(...) -> Default;
    template <typename U>
    static auto test(const U&) -> typename U::result_type;
public:
    using type = decltype(test(std::declval<T>()));
};

实时示例

T是定义result_type的类型时,测试(const U

然后通过计算表达式来推断类型,以查看选择了哪个重载。

利博远
2023-03-14

std::conditional\u t是在两种类型之间进行选择,但当t=int时,则t::result\u type不是一种类型。您可以使用sfinae:

#include <type_traits>

template <typename T, typename = void>
struct result_type_or_void {
    using type = void;
};
template <typename T>
struct result_type_or_void<T,std::void_t<typename T::result_type>> {
    using type = typename T::result_type;
};

template<class T>
struct ResultType
{
    using type = typename result_type_or_void<T>::type;
};

struct Test {
    using result_type = int;
};

int main() {
    ResultType<int> t;
    static_assert( std::is_same_v<ResultType<int>::type,void>);
    static_assert( std::is_same_v<ResultType<Test>::type,int>);
}
华甫
2023-03-14

在以下方面:

using type = std::conditional_t<std::is_class_v<T>, typename T::result_type, void>;

当零件T=int时,零件T::result\u type将失败,因为类型int::result\u type的格式不正确。

您可以通过使用模板专门化来解决此问题,而不是使用std::conditional,当T不是类类型时,它会执行完全相同的操作,但避免执行result\u type:

#include <type_traits>

template <typename T, typename = void>
struct ResultType;

template <typename T>
struct ResultType<T, std::enable_if_t<!std::is_class_v<T>>> {
    using type = void;
};

template<typename T>
struct ResultType<T, std::enable_if_t<std::is_class_v<T>>> {
    using type = typename T::result_type;
};

// ...

struct X {
    using result_type = int;
};

int main() {
    static_assert(std::is_same_v<typename ResultType<X>::type, typename X::result_type>, "FAIL!");
    static_assert(std::is_same_v<typename ResultType<int>::type, void>, "FAIL!");
}
 类似资料:
  • 本节介绍 TypeScript 高级类型中的条件类型(conditional type),条件类型就是在初始状态并不直接确定具体类型,而是通过一定的类型运算得到最终的变量类型。 1. 慕课解释 条件类型用来表达非均匀类型映射,可以根据一个条件表达式来进行类型检测,从两个类型中选出其中一个: T extends U ? X : Y 语义类似三目运算符:若 T 是 U 的子类型,则类型为 X,否则类

  • 我有一个现有的C#泛型类,希望根据使用的类型添加或删除一个方法,我解释道 对于特定的

  • 问题内容: 我很好奇Java的类和double的原始类型之间的性能差异是什么。因此,我创建了一个基准测试,发现类类型比原始类型慢3到7倍。(在本地计算机OSX上为3x,在ideone上为7x) 这是测试: http://ideone.com/fDizDu 那么为什么Double类型要慢得多呢?为什么还要实施它以允许数学运算符? 问题答案: 那么为什么Double类型要慢得多呢? 因为该值包装在需要

  • 由于Solidity是一个静态类型的语言,所以编译时需明确指定变量的类型(包括本地变量或状态变量),Solidity编程语言提供了一些基本类型(elementary types)可以用来组合成复杂类型。 类型可以与不同运算符组合,支持表达式运算,你可以通过表达式的执行顺序(Order of Evaluation of Expressions)来了解执行顺序。 值类型(Value Type) 值类型

  • 问题内容: 我刚刚开始自学如何编码。我目前正在阅读适用于python 3的 Think Python 2 ,并且在讲授该功能时,给出了输出示例。然后声明“在类别的意义上使用了“类”一词;类型是值的类别。” 令我困惑的部分是函数输出类而不是类型。另外,我不确定类型和类之间的区别。是字符串,浮点数和“值”类型的整数类,还是同一件事? 我已经查询了一下,但是找不到我的特定问题的答案,或者太简单了,无法理

  • 我最近才开始自学如何编码。我目前正在阅读Think Python2 for Python3,当它介绍函数时,它给出了输出