【问题标题】:How to use is_arithmetic taking an universal reference?如何使用 is_arithmetic 获取通用参考?
【发布时间】:2017-10-26 14:39:22
【问题描述】:

使用可变参数模板,我创建了对元素求和的函数。

效果很好,但我想添加一个 type_trait 测试来检查传递的所有参数是否都是数字类型。

如果我给出 r 值,它会起作用,但如果我给出左值,它会阻塞。

    sum.h

#ifndef SUM_H_INCLUDED
#define SUM_H_INCLUDED

#include<type_traits>

template <typename T>
double sums_(T && arg)
{
    static_assert(std::is_arithmetic<T>::value,"Only numbers !");
    return arg;
}

template <typename T, typename ... Args>
double sums_(T && val, Args &&... args)
{
    return sums_(std::forward<T>(val)) + sums_(std::forward<Args>(args)...);
}

template <typename ... Args>
double sums(Args &&... args)
{
    return sums_(std::forward<Args>(args)...);
}


#endif // SUM_H_INCLUDED

    main.cpp

#include <iostream>
#include "sum.h"


int main()
{

    //works
    std::cout << sums(42.30,28) << std::endl;

    int x = 100;
    //error
    std::cout << sums(42.30,28,x) << std::endl;

    return 0;
}

这似乎很正常,因为 is_arithmetic::value = false 对于数字类型的引用 (http://en.cppreference.com/w/cpp/types/is_arithmetic)。但是,在通用引用的情况下,我如何测试我的变量是否为数字?

【问题讨论】:

    标签: c++ typetraits forwarding-reference


    【解决方案1】:

    你想要

    std::is_arithmetic<std::remove_reference_t<T>>
    

    因为转发引用使 T 成为对可能具有 cv 限定的类型或此类类型本身的引用,并且 is_arithmetic 已经处理 cv 限定符。

    【讨论】:

    • 完美运行。谢谢!
    猜你喜欢
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多