Перегрузка оператора шаблона класса для фундаментальных и конкретных нефундаментальных типовC++

Программы на C++. Форум разработчиков
Anonymous
Перегрузка оператора шаблона класса для фундаментальных и конкретных нефундаментальных типов

Сообщение Anonymous »

Я просто пишу в классе MathVector

Код: Выделить всё

template MathVector
{
using value_type = T;

// further implementation
};
Однако считается, что класс работает как с фундаментальными типами, так и, скажем, со сложным классом

Код: Выделить всё

template Complex
{
using value_type = T;

// further implementation
};
который предлагает, например, функции-члены

Код: Выделить всё

template Complex& Complex::operator*=(const Complex& c);
template Complex& Complex::operator*=(const T& c);
Теперь для класса MathVector определено также умножение:

Код: Выделить всё

template MathVector& MathVector::operator*=(const MathVector& c);
Это нормально для T=double, но для T=Complex я хотел бы иметь возможность умножать также с помощью double > без предварительного преобразования его в Complex (гораздо эффективнее).
Это усугубляется тем, что Код также должен работать в коде устройства CUDA (я опустил спецификатор __host__ __device__ для краткости). Это означает, что инструменты стандартной библиотеки вам не помогут.
Сначала я подумал о дополнительном параметре шаблона

Код: Выделить всё

template MathVector& MathVector::operator*=(const U& c);
Но мне это кажется опасным, потому что U может быть намного больше, чем T или T::value_type. (На самом деле этот параметр сначала был у меня также в классе Complex - компилятор больше не мог решить, какой шаблон использовать: шаблон класса Complex или шаблон класса MathVector.)
Вторая идея — использовать специализацию шаблона

Код: Выделить всё

template MathVector& MathVector::operator*=(const U& c)
{
static_assert(sizeof(T) == 0, "Error...");
}
template MathVector& MathVector::operator*=(const typename T::value_type& c)
{
// implementation
}
Но это больше не будет работать с фундаментальными типами!
Я видел решения этой (или очень похожей) проблемы в операторе C++ Перегрузка для матричного класса с действительными и комплексными матрицами и возвратом двойного или комплексного значения из функции шаблона, но они решаются с использованием стандартной библиотеки способом, который невозможен для CUDA.
Итак, мой вопрос: есть ли способ перегрузить оператор, который работает с фундаментальными типы и с типами, которые обслуживают value_type, но не для других - без использования std:: вещей, которые компилятор nvcc отклонит?

Подробнее здесь: https://stackoverflow.com/questions/391 ... undamental

Вернуться в «C++»