2014-10-08 11 views
1

user-defined literals을 두 개 구현하고 싶습니다. 킬로미터 당 _kmh, 초당 미터는 _msh입니다. 내가 할 수없는사용자 정의 리터럴을 사용하여 km/h 및 m/s 구현

void func(MS speed) {} 

int main() { 
    func(10.0_kmh); // this works 
    func(10.0_ms); // this does not 
} 

: 나는 그것이 내가 이런 일을 할 수있는 방법으로 그것을 구현하려는

constexpr KMH operator "" _ms(long double val) { 
    return KMH {static_cast<double>(val * 3.6)}; 
} 
constexpr MS operator "" _kmh(long double val) { 
    return MS {static_cast<double>(val/3.6)}; 
} 

: 이미 두 그것을위한 구조체 및 운영자 ""기능을 가지고 나는 이런 식으로 구현할 수 없기 때문에, 작업에 대한 두 번째 전화를받을 :

constexpr KMH operator "" _kmh(long double val) { 
    return KMH {static_cast<double>(val)}; 
} 

을이 분명히 나에게 오류를 제공

error: functions that differ only in their return type cannot be overloaded

내가 원하는 것을 구현할 수있는 방법이 있습니까?

+0

나는 KMH와 MS가 다른 유형 (예 : typedeff'd)이 될 필요가 있다고 생각합니다. – Galik

+0

@ 갈릭 : 글쎄, 그들은 두 가지 모두를 기반으로하지만 구조가 다릅니다. – gartenriese

+4

기본 단위 및 해당 기본 단위로 변환을 수행하는 리터럴 연산자를 사용하는 경우 속도가 한 가지 유형 만 있습니다. – AProgrammer

답변

0

AProgrammer으로 제안되었으므로 속도를 높이기 위해 하나의 기본 구조체 만 사용하는 것이 좋습니다.

struct speed { 
    float m_val; 
    constexpr speed(float val) : m_val{val} {} 
    operator float() const { return m_val; } 
}; 

constexpr speed operator "" _ms(long double val) { 
    return speed {static_cast<float>(val)}; 
} 
constexpr speed operator "" _kmh(long double val) { 
    return speed {static_cast<float>(val)/3.6f}; 
} 
2

당신은 추가 할 수 있습니다 비 KMH

class MS 
{ 
public: 
    constexpr MS(const KMH& kmh) : val(kmh.val * 3.6) {} 

// your previous stuff 
}; 

BTW 걸릴 MS에서 operator MS()

class KMH 
{ 
public: 
    operator MS() const { return {val/3.6}; } 

// your previous stuff 
}; 

또는 비 명시 적 constructor, 당신은 하나의 구조체 (MS)을 고수하고 만들 수 있습니다 명시 적으로 모든 operator ""_ms , ""_kmh return MS

+0

나는 그것을 생각하지 않았다! 하지만 나는 MS와 KMH 모두를 위해 하나의 구조체만을 고집 할 것이고, 나에게 더 쉬운 것처럼 보인다. – gartenriese