Код: Выделить всё
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);
Код: Выделить всё
template MathVector& MathVector::operator*=(const MathVector& c);
Это усугубляется тем, что Код также должен работать в коде устройства CUDA (я опустил спецификатор __host__ __device__ для краткости). Это означает, что инструменты стандартной библиотеки вам не помогут.
Сначала я подумал о дополнительном параметре шаблона
Код: Выделить всё
template MathVector& MathVector::operator*=(const U& c);
Вторая идея — использовать специализацию шаблона
Код: Выделить всё
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