В моей работе есть несколько шаблонных математических классов (например, матрицы).
Объект может быть реализован с использованием чисел с плавающей запятой или двойных чисел (или других числовых типов, но в этом отношении это на самом деле не имеет значения).
Двойной объект может взаимодействовать только с другим двойным объектом.Для этого функция convert () была реализована для различных типов, с реализацией, подобной этой:
Matrix<T2> convert(const Matrix<T1>& m, T2 dummy) {
// create a matrix with type T2 and cast m values into it
// retMatrix(i, j) = (T2)m(i,j)
}
Вы бы назвали ее с помощью:
auto floatMatrix = convert(doubleMatrix, 0.f);
Или чуть более многословно:
auto floatMatrix = convert(doubleMatrix, float());
Я хочу добавить функцию, подобную приведенной ниже, которая позволит более чистым (IMHO) способом вызывать эти функции
template <typename T, typename S>
auto convert(S&& s) -> decltype(convert(s, T())) {
return convert(s, T());
}
Теперь их можно вызывать с помощью:
auto floatMatrix = convert<float>(doubleMatrix);
Мой вопрос в том, что моя сигнатура функции довольно неловкая, мне нужно повторить convert(s, T())
как в типе decl, так и в реальном теле функции
Как мне преодолеть это?
спасибо
edit:
в настоящее время мы не используем c ++ 14
edit # 2:
класс Matrix былпросто пример, есть довольно много соответствующих классов, для которых реализована функция convert ().Каждый из них уже "специализирован", как кто-то предложил в ответе ниже (тем временем удалено).Я хотел бы настроить способ вызова convert () без повторной реализации всего
edit # 3:
поддерживаемые типы, очевидно, отличаются только от float и double.пожалуйста, рассмотрите пример, который я привел, а не реальную проблему, которую я пытаюсь решить
«фиктивные» функции уже реализованы, я пытался заставить их работать с минимальными усилиями вместо рефакторинга 30функции и все виды использования
Я не думаю, что этот вопрос слишком надуман, учитывая, что cpp14 позволяет просто удалить -> decltype()
thingy ...