Size: a a a

2020 December 16

АК

Александр Караев... in pro.cxx
In Dev
Добрый день.
Как лучше всего сохранить как член класса visitor, скажем, для вызова в std::visit?
Вызов асинхронный, устанавливаться visitor должен в рантайме вроде my_object.set_visitor(visitor).

В каком-то смысле это расширенная вариация сохранения коллбека в std::function, хотелось бы избежать использования std::function<void(std::variant<...>)>
Если посещаемый объект известен заранее (или ссылка на него), можно сразу замкнуть и сохранить в std::function<void()>. Если нет, то увы
источник

ПК

Побитый Кирпич... in pro.cxx
In Dev
Добрый день.
Как лучше всего сохранить как член класса visitor, скажем, для вызова в std::visit?
Вызов асинхронный, устанавливаться visitor должен в рантайме вроде my_object.set_visitor(visitor).

В каком-то смысле это расширенная вариация сохранения коллбека в std::function, хотелось бы избежать использования std::function<void(std::variant<...>)>
А в чем проблема? Визитор это обычный функтор
источник

ID

In Dev in pro.cxx
Побитый Кирпич
А в чем проблема? Визитор это обычный функтор
Проблема в том, что std::function хочет конкретные типы аргументов, а у меня подразумевается, что operator() перегружен и может принимать разные типы аргументов
источник

ID

In Dev in pro.cxx
Т.е. положить функтор в std::function не выходит, т.к. шаблон для него непонятно как написать
источник

АК

Александр Караев... in pro.cxx
In Dev
Проблема в том, что std::function хочет конкретные типы аргументов, а у меня подразумевается, что operator() перегружен и может принимать разные типы аргументов
auto real_visitor = [](auto) {};

std::function<void(std::variant<...>)> f = [](auto variant) {
 std::visit(real_visitor, std::move(variant));
};
источник

ПК

Побитый Кирпич... in pro.cxx
In Dev
Т.е. положить функтор в std::function не выходит, т.к. шаблон для него непонятно как написать
Дак не клади в function
источник

ПК

Побитый Кирпич... in pro.cxx
Visitor m_visitor;
источник

ID

In Dev in pro.cxx
Побитый Кирпич
Visitor m_visitor;
В таком случае нет поддержки для лямбд, например, и статических функций
источник

ПК

Побитый Кирпич... in pro.cxx
In Dev
В таком случае нет поддержки для лямбд, например, и статических функций
Тогда тебе в любом случае в своем type erasure типе надо указывать список всех типов в варианте. Думаю function<void(variant<...>)> самый норм
источник

ПК

Побитый Кирпич... in pro.cxx
Либо писать свой type erasure
источник

ID

In Dev in pro.cxx
Александр Караев
auto real_visitor = [](auto) {};

std::function<void(std::variant<...>)> f = [](auto variant) {
 std::visit(real_visitor, std::move(variant));
};
Да, прошу прощения, вариант видимо был не очень хорошим примером. Типы мне известны, но они не лежат в варианте изначально, а просто отдаются в хендлер как f(obj)
источник

ID

In Dev in pro.cxx
Побитый Кирпич
Либо писать свой type erasure
Потому и спросил, думается должен быть какой-то более-менее стандартный способ
источник

NP

Nikita Provotorov in pro.cxx
Побитый Кирпич
Либо писать свой type erasure
шаблонный operator() все равно написать не выйдет
источник

ID

In Dev in pro.cxx
Nikita Provotorov
шаблонный operator() все равно написать не выйдет
Это почему?
источник

ID

In Dev in pro.cxx
https://en.cppreference.com/w/cpp/language/member_template
Пожалуйста, первый пример
источник

NP

Nikita Provotorov in pro.cxx
In Dev
https://en.cppreference.com/w/cpp/language/member_template
Пожалуйста, первый пример
я имел в виду type erasure с шаблонным operator()
источник

ID

In Dev in pro.cxx
Nikita Provotorov
я имел в виду type erasure с шаблонным operator()
Да, вы правы, но раз типы мне известны это можно и потерпеть)
источник

JJ

Joshua Jakowlew in pro.cxx
Это все таки не кублас, спасибо за наводку! Вечером буду пробовать
источник

JJ

Joshua Jakowlew in pro.cxx
Переслано от Александр Малахов...
Товарищ мне посоветовал вот это попробовать

https://stackoverflow.com/questions/37731103/cublas-matrix-inverse-much-slower-than-matlab
источник

ID

In Dev in pro.cxx
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
источник