如何使用is_arithmetic采取通用参考

How to use is_arithmetic taking an universal reference?

本文关键字:参考 arithmetic 何使用 is      更新时间:2023-10-16

玩弄可变参数模板,我制作了对元素求和的函数。

它运行良好,但我想添加一个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) 的引用。但是,在通用引用的情况下,我如何测试我的变量是否是数字?

你想要

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

由于转发引用使T引用可能是符合 CV 条件的类型或此类类型本身,并且is_arithmetic已经处理了 CV 限定符。