2016-05-13 2 views
2

Я переписываю библиотеку, где один из «интерфейсов» является глобальной числовой переменной (не спрашивайте).std :: min/std :: max с «intrinsic-like»

я заменить его глобальным объект UDT, который действует как числовые, поддерживая operator int() const

Некоторых потребителей в доме моей библиотеки использования станда :: макс с этим глобальным. Они будут получать ошибки компиляции, потому что станд :: макс ожидает только один Т.

Например:

PseudoInt x; // in library 

// in consumer 
void conumser() 
{ 
    int y = std::max(5, x); // will error now, because int and PseudoInt are not the same T 
} 

Я бы оптимально, как мои потребители не должны реагировать, делая такие вещи, как std::max<int>(5, x).

Мне повезло здесь?

+3

Почему бы не написать свою собственную функцию max, которая берет 'PseudoInt', а затем передает ее на' std :: max'? – NathanOliver

+0

Может быть, если вы создадите неявный конструктор из int в этот тип данных и специализацию шаблона для std :: max? Но явный вызов с int как аргументом шаблона не будет работать. – languitar

+0

Не добавляйте неявные конструкторы! Еа! –

ответ

3

С std::max является шаблон, вы можете получить специализацию по std::max с помощью PseudoInt и Int.

+0

Спасибо, да, я подумал об этом. Я искал более универсальное решение, которое обрабатывает все алгоритмы, а не только std :: max. Я должен был сделать это более явным в моем вопросе. Если я не вижу волшебной пули (и я не думаю, что она есть, тбх), я отмечу это как принятое решение. – kkost

+0

У меня это работает, спасибо - My PseudoInt немного сложнее, чем оригинальный spec'ed. Это шаблон. PseudoGlobal \t шаблон <Ьурепате NUMERIC_T, Ьурепате PSEUDONUMERIC_T> \t NUMERIC_T макс (NUMERIC_T а, PseudoGlobal б) \t { \t \t возврата станд :: макс (а, static_cast (б)); \t} ... – kkost

Смежные вопросы