2017-10-26 24 views
0

가변성 템플릿으로 연주하기 요소를 합한 함수를 만들었습니다.is_arithmetic을 범용 참조로 사용하는 방법은 무엇입니까?

잘 작동하지만 전달 된 모든 인수가 숫자 형식인지 확인하기 위해 type_trait 테스트를 추가하고 싶습니다.

내가 r 값을 주면 작동하지만, lvalues를 주면 차단됩니다.

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 :: 보낸 값 = 숫자 타입 (http://en.cppreference.com/w/cpp/types/is_arithmetic)의 참조 거짓. 하지만 범용 참조의 경우 변수가 숫자인지 어떻게 테스트 할 수 있습니까? 전달 참조가 가능 이력서 자격 유형이나 같은 유형 자체에 T 참조 중 하나를 만드는 것이므로

답변

2

당신은

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

을 원하고 is_arithmetic 이미 이력서 - 예선을 처리합니다.

+0

완벽하게 작동합니다. 감사 ! – Nix