Условно включить оператор конверсии с SfinaeC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Условно включить оператор конверсии с Sfinae

Сообщение Anonymous »

[Примечание: я застрял с C ++ 17.] < /p>
У меня есть шаблон класса, который создается в довольно большом количестве типов (~ 25). Некоторые из них могут правильно преобразовать друг друга, и я хотел бы, чтобы это произошло неявно. Я думаю, что это означает, что я должен сделать оператор конверсии в шаблон класса, но условно включает его с помощью Sfinae, где условие в том, что я вручную написал функцию преобразования, принимая правильные типы, где это имеет смысл. Вот чрезвычайно упрощенный пример, который иллюстрирует проблему: < /p>

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

#include 

template 
class Template;

class SourceType {};
class TargetType {};

// forward-declare the convert() so that the declval() can look at it
const Template & convert(const Template &);

template 
class Template
{
public:
template 
explicit operator const U& () const { return convert(*this); }
};

// need the Template class template to be defined
// before this function is defined because we'll need to use its members
const Template & convert(const Template &)
{
// obviously not a real implementation
return *new Template();
}

int main()
{
Template src;

// try to explicitly call the conversion operator to test it
src.operator const Template&();

return 0;
}

< /code>
Это не компилируется.  GCC 13 (как всегда) дает мне запутанную ошибку, неверная инициализация ссылки типа «шаблон const»  & 'из выражения типа «шаблон const ' 
, в то время как мой клион IDE не рассказывает мне нет функции сопоставления Для вызова «преобразовать» в экземпляре шаблона класса шаблона «TargetType>», запрошенная здесь кандидат. 'const template ' to 'const template ' для 1 -го аргумента .
Я думаю, что я как -то непреднамеренно создал цикл, где оба Convert ()

Подробнее здесь: https://stackoverflow.com/questions/794 ... ith-sfinae
Ответить

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

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

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

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

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