2014-10-08 5 views
1

Я хочу реализовать два user-defined literals, _kmh для километров в час и _ms для метров в секунду. У меня уже есть два для этого структур и оператор «» функции:Реализация км/ч и м/с с пользовательскими литералами

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)}; 
} 

Я хочу, чтобы реализовать это таким образом, что я могу мог бы сделать что-то вроде этого:

void func(MS speed) {} 

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

я не могу получить второй вызов на работу, потому что я не могу реализовать это следующим образом:

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

@Galik: Ну, они оба основаны на двойном, но являются отдельными структурами. – 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

Вы можете добавить не явное operator MS()

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

// your previous stuff 
}; 

или не явно constructor в MS, которые принимают KMH

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

// your previous stuff 
}; 

Кстати, вы можете придерживаться только один структуры (MS) и сделать все ваши operator ""_ms , ""_kmh возвращение MS

+0

Я не думал об этом! Но я думаю, что я буду придерживаться только одной структуры для MS и KMH, мне кажется легче. – gartenriese