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

SFINAE问题与特征检测部门

公西良骏
2023-03-14

我有以下特征来检测两种类型是否可除,并返回结果操作类型或另一种Defaulttype,否则返回:

struct default_t { };

// Overloaded template for fallbacks
template <class U, class V>
default_t operator/(U, V);

// If the expression std::declval<U>()/std::declval<V>() is valid,
// gives the return type, otherwize provide Default.
template <class U, class V, class Default>
struct div_type_or {
    using type_ = decltype(std::declval<U>() / std::declval<V>());
    using type = typename std::conditional<
        std::is_same<type_, default_t>{},
            Default,
            type_>::type;
};

template <class... Args>
using div_type_or_t = typename div_type_or<Args...>::type;

当我尝试使用不可分割的std::chrono::duration类型时,这对libstdc很有效,但对libc不起作用,例如:

struct A { };

div_type_or_t<std::chrono::seconds, A, int> b;

我得到以下错误:

/Library/Developer/CommandLineTools/usr/include/c/v1/chrono:764:81:错误:std:_1::common_type“”typename common_type::type中没有名为“type”的类型

/Library/Developer/CommandLineTools/usr/include/c/v1/chrono:777:7:注意:在“_duration_divide_imp”的默认参数的实例化中

/Library/Developer/CommandLineTools/usr/include/c/v1/chrono:784:10:注意:在模板类std:_1::chrono::_duration_divide_result的实例化中

测验cpp:16:46:注意:在将推导出的模板参数替换为函数模板“operator/”[with _Rep1=long long,_Period=std::_1::ratio]时

test.cpp:24:1:注意:在模板类的实例化中div_type_or

测验cpp:48:19:注意:在模板类型别名“div_type_或_t”的实例化中,此处请求div_type_或_t,D

据我所知,这是因为std::chrono::durationoperator/的以下重载失败:

template< class Rep1, class Period, class Rep2 >
duration<typename std::common_type<Rep1,Rep2>::type, Period>
    constexpr operator/( const duration<Rep1, Period>& d,
                         const Rep2& s );

我认为,由于std::common_type是函数签名的一部分,这将允许SFINAE工作并使用我的自定义重载运算符/,从而推导出default_t,但显然这不起作用...

由于这对libstdc有效,我只想知道我的代码是否有问题(可能我不理解SFINAE在这种情况下的工作方式),或者这是libc错误?

共有1个答案

壤驷宏才
2023-03-14

在libc,我们有:

template <class _Duration, class _Rep, bool = __is_duration<_Rep>::value>
struct __duration_divide_result
{
};

template <class _Duration, class _Rep2,
    bool = is_convertible<_Rep2,
                          typename common_type<typename _Duration::rep, _Rep2>::type>::value>
struct __duration_divide_imp
{
};

template <class _Rep1, class _Period, class _Rep2>
struct __duration_divide_imp<duration<_Rep1, _Period>, _Rep2, true>
{
    typedef duration<typename common_type<_Rep1, _Rep2>::type, _Period> type;
};

template <class _Rep1, class _Period, class _Rep2>
struct __duration_divide_result<duration<_Rep1, _Period>, _Rep2, false>
    : __duration_divide_imp<duration<_Rep1, _Period>, _Rep2>
{
};

template <class _Rep1, class _Period, class _Rep2>
inline _LIBCPP_INLINE_VISIBILITY
_LIBCPP_CONSTEXPR
typename __duration_divide_result<duration<_Rep1, _Period>, _Rep2>::type
operator/(const duration<_Rep1, _Period>& __d, const _Rep2& __s)
{
    typedef typename common_type<_Rep1, _Rep2>::type _Cr;
    typedef duration<_Cr, _Period> _Cd;
    return _Cd(_Cd(__d).count() / static_cast<_Cr>(__s));
}

因此,与其使用std::common_类型

这种用法是一个严重的错误。

我想说,在这方面,libc的实现是不正确的。

 类似资料:
  • 我是新的对象检测,我有泰米尔语字符,我成功地做了分类部分使用CNN。 对于对象检测,我遵循以下示例--https://towardsdatascience.com/getting-starting-with-bounding-box-regression-in-tensorflow-743E22D0CCB3 我们必须创建边界框并创建注释文件,其中包含图像中存在的对象的数量以及对象的(Xmin,Ym

  • 我正在努力升级一些C代码,以利用C 11中的新功能。我有一个trait类,其中有几个函数返回基本类型,大多数情况下,但并非总是返回常量表达式。我想根据函数是否为来做不同的事情。我提出了以下方法: 额外的< code>int/参数的作用是,如果SFINAE之后两个函数都可用,重载解析将选择第一个函数。 用Clang 3.2编译并运行该代码显示: 所以这似乎有效,但我想知道代码是否合法C 11。特别是

  • 本文向大家介绍特征工程的问题相关面试题,主要包含被问及特征工程的问题时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 特征工程包括数据与特征处理、特征选择和降纬三部分。数据与特征处理包括: 1.数据选择、清洗、采样 数据格式化; 数据清洗,填充缺失值、去掉脏数据,将不可信的样本丢掉,缺省值极多的字段考虑不用; 采样:针对正负样本不平衡的情况,当正样本远大于负样本时,且量都很大时,使用下采样,

  • @subpage tutorial_py_features_meaning_cn 图像中的主要特征是什么?如果找出对我们来说有用的特征? @subpage tutorial_py_features_harris_cn 好吧, 边角是好的特征。但我们该如何找到它们呢? @subpage tutorial_py_shi_tomasi_cn 我们将会研究Shi-Tomasi角点检测。 @subpage

  • 我需要一个类型特征,将枚举分解为它们的底层类型,并与所有其他类型的一样工作。我编写了以下代码,显然这不是SFINAE的工作方式。但这是我认为它应该如何工作的,那么这段代码到底有什么问题,我对C的理解有什么差距? MSVC中的错误完全无法理解: “detail::BaseType”:模板参数“_formal”与声明不兼容 在GCC中更好一点——说第二个模板参数的声明在两个模板之间不兼容。但是根据我对

  • 将跟踪和跨度添加到Slf4J MDC,以便您可以从日志聚合器中的给定跟踪或跨度中提取所有日志。示例日志: 2016-02-02 15:30:57.902 INFO [bar,6bfd228dc00d216b,6bfd228dc00d216b,false] 23030 --- [nio-8081-exec-3] ... 2016-02-02 15:30:58.372 ERROR [bar,6bfd