숫자 형식이 정수인지 또는 소수 부분을 가질 수 있는지를 결정하기 위해 이와 같은 작업을 수행 할 수 있습니다. 이 코드는 숫자가 아닌 형식으로는 컴파일되지 않지만 원하는 경우 임의의 형식을 필터링하기 위해 추가 메타 프로그래밍을 추가 할 수 있습니다. 정적 bool 값 대신 "true"유형 또는 "false"유형 (예 : Rapptz '응답)을 제공하도록 수정 될 수도 있습니다.
필자는 형식이 아닌 값을 테스트하는 두 가지 방법을 제시했습니다. 하나는 decltype을 사용하여 유형을 가져오고 다른 하나는 템플릿 함수를 사용합니다. 이 함수는 decltype을 사용할 수없는 경우 사용할 수 있지만 그 결과는 런타임에만 사용할 수 있습니다 (decltype이 아닌 경우에는 constexpr을 사용할 수 없습니다).
VALUE_IS_INTEGER 매크로 및 value_is_integer 템플릿 함수는 주어진 값이 정수인지 아닌지 테스트하지 않고 값 유형이 정수인지 여부를 테스트합니다.
#include <iostream>
template <typename T, bool IS_INTEGRAL = T(3)/T(2)<=T(1) || T(3)/T(2)>=T(2)>
struct IsIntegerTypeCheck {
static const bool is_integer = IS_INTEGRAL;
};
#define TYPE_IS_INTEGER(type) (IsIntegerTypeCheck<type>::is_integer)
#define VALUE_IS_INTEGER(value) (IsIntegerTypeCheck<decltype(value)>::is_integer)
template <typename T> static bool value_is_integer(const T& value) {
return IsIntegerTypeCheck<T>::is_integer;
}
template <typename ST>
void dump_bool(ST message, bool value) {
std::cout << message << ' ' << (value ? "true" : "false") << "\n";
}
int main() {
static const bool int_is_integer = TYPE_IS_INTEGER(int);
static const bool float_is_integer = TYPE_IS_INTEGER(float);
static const long unity = 1;
static const double tau = 3.1415925 * 2;
static const bool unity_is_integer = VALUE_IS_INTEGER(unity);
static const bool tau_is_integer = value_is_integer(tau);
dump_bool("int is integer: ", int_is_integer);
dump_bool("float is integer:", float_is_integer);
dump_bool("unity is integer:", unity_is_integer);
dump_bool("tau is integer: ", tau_is_integer);
return 0;
}
아마도 부스트 코드베이스가이 답변을 직접 제공 할 수 있습니까? 예, 코드를 샅샅이 뒤져서 어떻게 끝났는지 확인합니다 ... – abiessu
내가 아는 두 가지 주요 방법은 각각의 정수형을 전문화하거나 유형 목록을 작성하고이를 살펴 보는 것입니다. – chris
@abiessu 나는 게으르다하지만 솔직히 Boost 코드를 읽기가 어렵다고 생각하고 질문을함으로써 대체 방법을 제시하는 완전한 설명을 얻을 수 있습니다. – Praxeolitic