Здравствуйте, rg45, Вы писали:
R>Здравствуйте, Went, Вы писали:
W>>А насколько можно быть увереным, что у лямбды не будет перегруженного оператора скобки? За исключением обобщенных лямбд, возможны отказы в подобной реализации трейтов?
R>Признаться, никаких гарантий я найти не смог. Ни по поводу отсутствия дополнительных перегрузок, ни по поводу наличия единственного необходимого оператора. Так что здесь вся надежда на здравый смысл и результаты эксперимента на разных компиляторах. Ну в самом деле, что это может быть, если не operator() и каким образом может оказаться несколько перегрузок?
7.5.5 lambda-expressionis a prvalue whose result object is called theclosure object. [Note: A closure objectbehaves like a function object
7.5.5.1 Closure types[expr.prim.lambda.closure]1
The type of alambda-expression(which is also the type of the closure object) is a unique, unnamed non-unionclass type, called theclosure type, whose properties are described below.
Есть гарантия, что это класс с операцией вызова "operator()".
O>И да — меня тоже раздражает, когда кто-то мыслит так как ты. Если написано сложно, то так писать нельзя. Сложно, иногда — необходимость, и сршенно все равно, может понять это кто-то, или нет.
Иногда сложность вызвана кулхацкерскими амбициями, иногда — идиотским дизайном языка. В этих случаях необходимости нет.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
_NN>7.5.5 lambda-expressionis a prvalue whose result object is called theclosure object. [Note: A closure objectbehaves like a function object
_NN>7.5.5.1 Closure types[expr.prim.lambda.closure]1
_NN>The type of alambda-expression(which is also the type of the closure object) is a unique, unnamed non-unionclass type, called theclosure type, whose properties are described below.
_NN>
_NN>Есть гарантия, что это класс с операцией вызова "operator()".
Ну вот если бы где-нибудь упоминался явно "operator()", это развеяло бы все мои сомнения, но этого же нет. 'like a function object', как я это понимаю, означает, что доступно выражение вида: f(). А вот доступно ли выражение вида f.operator()() ? В это хочется верить, конечно, и эксперименты это подтверждают, но... остается некоторая неудовлетворенность.
Здравствуйте, rg45, Вы писали:
R>Ну вот если бы где-нибудь упоминался явно "operator()", это развеяло бы все мои сомнения, но этого же нет. 'like a function object', как я это понимаю, означает, что доступно выражение вида: f(). А вот доступно ли выражение вида f.operator()() ? В это хочется верить, конечно, и эксперименты это подтверждают, но... остается некоторая неудовлетворенность.
В 7.5.5.1 12
The lambda-expression’scompound-statement yields thefunction-body(9.5) of the function call operator,
Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, ollv, Вы писали:
O>>И да — меня тоже раздражает, когда кто-то мыслит так как ты. Если написано сложно, то так писать нельзя. Сложно, иногда — необходимость, и сршенно все равно, может понять это кто-то, или нет.
TB>Иногда сложность вызвана кулхацкерскими амбициями, иногда — идиотским дизайном языка.
Давай выражаться конкретно, что тебе конкретно не нравится в том, что трейтсы в С++ с шаблонами и классами выглядят именно так.
Что ты предложил бы в замен (да в рамках реально работающего компилятора С++) ? НЕ нравится С++ в целом — никто не заставляет. НЕ нравятся шаблоны — предложи как лучше распарсить сигнатуру в компайлтайм. Вот это против всего плохого за все хорошее — не тот топик.
TB>В этих случаях необходимости нет.
Как это нет ? Нет необходимости парсить сигнатуру? Молодец
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, ollv, Вы писали:
O> Давай выражаться конкретно, что тебе конкретно не нравится в том, что трейтсы в С++ с шаблонами и классами выглядят именно так. O>Что ты предложил бы в замен (да в рамках реально работающего компилятора С++) ?
Я бы предложил расстрелять комитет для начала. И добавить в язык ключевые слова, которые бы прямо возвращали параметры сигнатуры.
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>Я бы предложил расстрелять комитет для начала. И добавить в язык ключевые слова, которые бы прямо возвращали параметры сигнатуры.
Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, ollv, Вы писали:
O>> Давай выражаться конкретно, что тебе конкретно не нравится в том, что трейтсы в С++ с шаблонами и классами выглядят именно так. O>>Что ты предложил бы в замен (да в рамках реально работающего компилятора С++) ?
TB>Я бы предложил расстрелять комитет для начала. И добавить в язык ключевые слова, которые бы прямо возвращали параметры сигнатуры.
В каком виде ?
Даже нет
Вот давай
template <typename... Args>
inline some_return_type fun(Args... args);
typedef GET_TYPE_BASED_SIGN_MACRO(fun(5, std::string(), float(), char()) sign_type;
ну и давай получим к примеру тип 3-го аргумента
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Ключевое слово, параметр — указатель на функцию или функциональный тип, или тип с оператором (), возвращающее тип.
Я не знаю, что такое GET_TYPE_BASED_SIGN_MACRO
Нет такой подлости и мерзости, на которую бы не пошёл gcc ради бессмысленных 5% скорости в никому не нужном синтетическом тесте
Здравствуйте, T4r4sB, Вы писали:
TB>Здравствуйте, ollv, Вы писали:
O>> В каком виде ?
TB>Ключевое слово, параметр — указатель на функцию или функциональный тип, или тип с оператором (), возвращающее тип.
Погоди — давай код, как бы ты хотел, чтобы оно выглядело. Задача есть — берешь сигнатуру и получаешь тип третьего параметра. как это делается на плюсах мы примерно все знаем.
Там много парсить и много кейсов, но принцип понятен . Давай покажи нам свое предложение. Что значит ключевое слово ?
так typedef TYPE_OF_3_PARAMETER(func(int(), int(), int(), int())) third_parameter_type; ?
TB>Я не знаю, что такое GET_TYPE_BASED_SIGN_MACRO
переименуй как хочешь я же тебе именно это предлагаю.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, rg45.
Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов
Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
Что-то такое:
void add_message_in_queue(const std::function<void()>&); // Эта функция ставит в очередь произвольный функтор без аргументов и возвратного значения.
// Эта функция должна взять произвольный функтор без возвратного значения, но с любым набором аргументов, и создать функтор с аргументами, который будет класть этот функтор в очередь, прибиндив аргументыtemplate<typename T>
auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
{
std::function<typename stdext::call_traits<T>::signature> result = [fnc](???) // Вот что записать тут?
{
add_message_in_queue(???); // И тут
};
return result;
}
void main()
{
auto x = [](int, float){};
auto y = defer(x);
y(1, 1.0f); // Должен не вызвать реализацию x, а положить его в очередь, прибиндив единицы как аргументы вызова к x.
}
Здравствуйте, Went, Вы писали: W>Здравствуйте, rg45. W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
Скрытый текст
W>Что-то такое: W>
W>void add_message_in_queue(const std::function<void()>&); // Эта функция ставит в очередь произвольный функтор без аргументов и возвратного значения.
W>// Эта функция должна взять произвольный функтор без возвратного значения, но с любым набором аргументов, и создать функтор с аргументами, который будет класть этот функтор в очередь, прибиндив аргументы
W>template<typename T>
W>auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
W>{
W> std::function<typename stdext::call_traits<T>::signature> result = [fnc](???) // Вот что записать тут?
W> {
W> add_message_in_queue(???); // И тут
W> };
W> return result;
W>
W>void main()
W>{
W> auto x = [](int, float){};
W> auto y = defer(x);
W> y(1, 1.0f); // Должен не вызвать реализацию x, а положить его в очередь, прибиндив единицы как аргументы вызова к x.
W>}
W>
так чтобы по быстрому. можно выдрать из сигнатуры тупл и т/к это локальная лямбда, в смысле не влияет на внешний интерфейс ? если да, то
typedef typename convert_2args_type<typename stdext::call_traits<T>::signature>::type args_tuple_type;
std::function<typename stdext::call_traits<T>::signature> result = [fnc](args_tuple_type const& args)
{
// Здесь форейч по всем аргументам и в конце итерации вызов непосредственно функции
call_func_add_message_in_queue<0>(args);
};
если же у тебя внешний интерфейс и локальная типизация извне не видна можно пихать в некий абстрактнфй тип вроде boost::any кастить перед вызовом.
Compiler can be as trained AI but can't compose music.
Antheil piano jazz sonata. Я болен ПГМ.
Здравствуйте, Went, Вы писали:
W>Здравствуйте, rg45. W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async. W>Что-то такое: W>
W>template<typename T>
W>auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
W>{
W> std::function<typename stdext::call_traits<T>::signature> result = [fnc](???) // Вот что записать тут?
W> {
W> add_message_in_queue(???); // И тут
W> };
W> return result;
W>}
W>
Ну, если я правильно понял идею, то так:
template<typename T>
auto defer(const T& fnc) -> typename std::function<typename stdext::call_traits<T>::signature> // stdext::call_traits<T> - это твои трейты, только в нижнем регистре :)
{
std::function<typename stdext::call_traits<T>::signature> result = [fnc](auto&&...args) // Вот что записать тут?
{
add_message_in_queue(fnc(std::forward<decltype(args)>(args)...)); // И тут
};
return result;
}
Хотя, из твоего описания, вроде бы, следует, что тут нужна еще одна обертка из std::function. Даже если и так, то там будет все по образу и подобию, как я показал.
Здравствуйте, Went, Вы писали:
W>Блин, когда 101% времени сидишь за прикладным кодом, голова вообще отказывается работать в направлении шаблонов W>Пишу в рамках С++11. Хочу сделать функцию, которая принимает произвольный вызываемый объект (без учета возвратного значения), и возвращает функтор с подобной сигнатурой, но этот функтор не вызывает исходный объект, а лишь ставит его в очередь сообщений, прибиндивая к нему те параметры, с которыми был вызван этот функтор. По-моему, это что-то похожее на async.
в рамках 11 проблемно.
шаблонные лямбды (вариант rg45) в 14 появились
как вариант возвращать ручную реализацию