class Test
{
public:
void foo()
{
std::cout << 0 << std::endl;
}
template< int N >
void fooN()
{
std::cout << N << std::endl;
}
template< typename Fn >
void invoke( Fn&& fn )
{
(*this.*fn)();
}
};
int main( int args, char *argv[] )
{
Test test;
using Fn = decltype(&Test::fooN<1>);
test.invoke<Fn>( &Test::foo ); // В моей задаче автовыведение типа не прокатит
test.invoke<Fn>( &Test::fooN<1> );
return 0;
}
Это студия тупит или я чего-то не понимаю? В студии не компилируется — говорит, что cannot convert argument 1 from 'void (__thiscall Test::* )(void)' to 'Fn (__thiscall &&)'.
Я так понимаю, что студия считает, что Test::fooN<1> это перегрузка. Но, перегрузка — это когда имя метода совпадает, а сигнатуры отличаются. Тут же сигнатуры совпадают, а имена методов — хз
Здравствуйте, SaZ, Вы писали:
SaZ>Это студия тупит или я чего-то не понимаю? В студии не компилируется — говорит, что cannot convert argument 1 from 'void (__thiscall Test::* )(void)' to 'Fn (__thiscall &&)'. SaZ>Я так понимаю, что студия считает, что Test::fooN<1> это перегрузка. Но, перегрузка — это когда имя метода совпадает, а сигнатуры отличаются. Тут же сигнатуры совпадают, а имена методов — хз
Я не знаю как оно должно быть, но вот так компилируется и запускается:
auto aF1 = &Test::fooN<1>;
using Fn1 = decltype(aF1);
test.invoke<Fn1>( &Test::fooN<1> );
test.invoke<Fn1>( &Test::foo );
Здравствуйте, SaZ, Вы писали:
SaZ>Это студия тупит или я чего-то не понимаю? В студии не компилируется — говорит, что cannot convert argument 1 from 'void (__thiscall Test::* )(void)' to 'Fn (__thiscall &&)'. SaZ>Я так понимаю, что студия считает, что Test::fooN<1> это перегрузка. Но, перегрузка — это когда имя метода совпадает, а сигнатуры отличаются. Тут же сигнатуры совпадают, а имена методов — хз
Не будет ли любезен уважаемый джинн пояснить, на кой ему здесь класс?
Стоит убрать из твоего кода класс — и всё заработает:
Здравствуйте, tstalker, Вы писали:
T>Не будет ли любезен уважаемый джинн пояснить, на кой ему здесь класс? T>Стоит убрать из твоего кода класс — и всё заработает:
Это как-бы тестовый пример. В реальной задаче всё несколько сложнее: C++ враппер вокруг одной си-шной библиотеки, со своим, достаточно специфическим, механизмом коллбэков. Немного повелосипедил с асинхронными межпоточными вызовами на чистом С++, сделав синтаксис, похожий на Qt-шный QObject::connect.
Здравствуйте, SaZ, Вы писали:
SaZ>Это как-бы тестовый пример. В реальной задаче всё несколько сложнее: C++ враппер вокруг одной си-шной библиотеки, со своим, достаточно специфическим, механизмом коллбэков. Немного повелосипедил с асинхронными межпоточными вызовами на чистом С++, сделав синтаксис, похожий на Qt-шный QObject::connect.
Ok, бро. Хочешь с классом — лови:
#include <iostream>
#include <functional>
class Test
{
public:
void foo()
{
std::cout << 0 << std::endl;
}
template<int N>
void fooN()
{
std::cout << N << std::endl;
}
template<typename Fn>
void invoke(Fn&& fn)
{
fn(this);
}
};
int main()
{
using Fn = decltype(std::mem_fn(&Test::fooN<1>));
Test test;
test.invoke<Fn>(std::mem_fn(&Test::foo));
test.invoke<Fn>(std::mem_fn(&Test::fooN<1>));
}
Здравствуйте, SaZ, Вы писали:
SaZ>Это студия тупит или я чего-то не понимаю? В студии не компилируется — говорит, что cannot convert argument 1 from 'void (__thiscall Test::* )(void)' to 'Fn (__thiscall &&)'. SaZ>Я так понимаю, что студия считает, что Test::fooN<1> это перегрузка. Но, перегрузка — это когда имя метода совпадает, а сигнатуры отличаются. Тут же сигнатуры совпадают, а имена методов — хз