Перегрузка оператора шаблона класса для фундаментальных и конкретных нефундаментальных типов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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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