2014-10-03 8 views
0

나는 예컨대 는 사용자 정의 리터럴을 사용하여 파생 된 SI 시스템 단위를 구현할 수 있습니까? 그것은 어떤 물리적 인 계산을 수행 할 수 있도록

auto force = 5_N;   // force in newton 
auto distance = 6.8_m; // distance in meters 

auto resultingEnergy = force * distance; // expected result in joules 

이 어떻게 달성 될 수

, 사용자 정의 리터럴에 과부하를 하시겠습니까?

+2

(또는 새로운 유형) 및 오버로드 된 연산자. 리터럴은 특정 유형의 값만 생성하며 구문 설탕을 사용합니다. –

+2

[Boost.Units] (http://www.boost.org/doc/libs/1_56_0/doc/html/boost_units.html)에서 아이디어를 얻을 수 있으며, 기본적으로 사용자 정의 리터럴이 적절한 부스트를 반환하도록 만들 수 있습니다. 단위 유형. – Angew

답변

1

당신은 몇 가지 새로운 유형을 정의 (또는 위에서 언급 한 바와 같이 부스트 단위를 사용) 할 수

사용자 정의 솔루션과 유사 할 수 있습니다 : 당신은 값에 대한 강력한 형식 정의를 필요 했어

#define DECLARE_UNIT(UnitName) \ 
struct UnitName { \ 
    UnitName(const long double val) noexcept : val_(val) {};\ 
    long double val_ = 0.0; \ 
}; 

DECLARE_UNIT(Joule); 
DECLARE_UNIT(Newton); 
DECLARE_UNIT(Meters); 

const Newton operator""_N(const long double n) noexcept { 
    return Newton(n); 
} 
const Meters operator""_m(const long double m) noexcept { 
    return Meters(m); 
} 

const Joule operator*(const Newton& newtons, const Meters& meters) noexcept { 
    return newtons.val_ * meters.val_; 
} 


int main() { 
    auto force = 5.0_N; 
    auto distance = 6.8_m; 
    auto energy = force * distance; // of Joule type 
}