如何修复此问题:
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
所以我不需要尝试调用错误的表达式,但是如何调用呢?
失败是因为选择了两个类型表达式中的一个,但此时类型表达式已经被计算过了。因为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
然后通过计算表达式来推断类型,以查看选择了哪个重载。
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>);
}
在以下方面:
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,当它介绍函数时,它给出了输出