Size: a a a

2020 December 16

VS

Vlad Serebrennikov in pro.cxx
In Dev
template<typename Signature> struct S;

template<typename ReturnT, typename ... Args>
struct S<ReturnT(Args...)>
{
   virtual ReturnT operator()(Args && ...) = 0;
};

struct Test : S<void(int)>
{
   void operator()(int a) override {}
};

ЧЯДНТ?
error: ‘void Test::operator()(int)’ marked ‘override’, but does not override
virtual потеряли в переопределенном operator()
источник

VS

Vlad Serebrennikov in pro.cxx
...наверное
источник

ID

In Dev in pro.cxx
Vlad Serebrennikov
virtual потеряли в переопределенном operator()
Нет, не нужен здесь virtual
источник

O

Ofee in pro.cxx
In Dev
template<typename Signature> struct S;

template<typename ReturnT, typename ... Args>
struct S<ReturnT(Args...)>
{
   virtual ReturnT operator()(Args && ...) = 0;
};

struct Test : S<void(int)>
{
   void operator()(int a) override {}
};

ЧЯДНТ?
error: ‘void Test::operator()(int)’ marked ‘override’, but does not override
На вскидку, в сигнатуре Args&& — ссылка, а int — нет
источник

ID

In Dev in pro.cxx
Как так? Там ведь Test : S<void(int)>
источник

DP

Denis Paukaev in pro.cxx
void operator()(int&& a) override {} же работает
источник

DP

Denis Paukaev in pro.cxx
значит дело в этом
источник

ID

In Dev in pro.cxx
Ааааа
источник

ID

In Dev in pro.cxx
Интересно, как тогда здесь зафорсить universal reference?
источник

S

Stas in pro.cxx
Если у тебя в операторе &&, а в другом операторе нет ссылки, то это не override
источник

DP

Denis Paukaev in pro.cxx
In Dev
Интересно, как тогда здесь зафорсить universal reference?
а где зафорсить, тут же типы явно передаются в шаблон класса
источник

O

Ofee in pro.cxx
In Dev
Интересно, как тогда здесь зафорсить universal reference?
Либо принимать int по ссылке, либо определять правила, какие объекты принимать по ссылке, а какие по значению, как-то так:

virtual ReturnT operator()(policy<Args>...) = 0;
источник

ID

In Dev in pro.cxx
Denis Paukaev
а где зафорсить, тут же типы явно передаются в шаблон класса
Но ведь в специализации шаблоны
источник

AT

Alexander Tulikov in pro.cxx
In Dev
Интересно, как тогда здесь зафорсить universal reference?
Используй просто int &, forwarding reference — это для шаблонов.
источник

DP

Denis Paukaev in pro.cxx
S<void(int)> -  в этот момент вся универсальность пропала
источник

ID

In Dev in pro.cxx
Alexander Tulikov
Используй просто int &, forwarding reference — это для шаблонов.
Это была заготовка, хотелось таким образом отнаследоваться от нескольких S<void(int)>, S<void(Object && obj)> и т.д. и таким образом получить интерфейс с перегрузками operator()
источник

ID

In Dev in pro.cxx
Так что тут подразумевались шаблоны, просто не срослось)
источник

DP

Denis Paukaev in pro.cxx
тут просто надо понять, в данном случае Args && ... - это не fwd ref, а rvalue всегда
источник

ID

In Dev in pro.cxx
Denis Paukaev
тут просто надо понять, в данном случае Args && ... - это не fwd ref, а rvalue всегда
Да, это я уже понял, теперь как-то полечить надо
источник

ID

In Dev in pro.cxx
А, ну собственно нужно было использовать
virtual ReturnT operator()(Args ...) = 0;
источник