Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/37: Рейтинг темы: голосов - 37, средняя оценка - 4.68
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607

std::is_invokable не работает для фунций членов

19.12.2019, 16:08. Показов 8112. Ответов 108
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Это так и должно бытьили я чтото неправильно делаю ?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.12.2019, 16:08
Ответы с готовыми решениями:

Не работает std::cout || std::cin
#include "Account.h" #include <string> #include <iostream> using std::cout; Account :: Account(int startBalance) { ...

Операция std::cout для Объекта типа std::string
Кто детально объяснит почему не выводит ? Дает вот так "Отсутствует оператор "<<", соответствующий этим операндам" ...

Не воспринимает ни std::cout, ни std::cin. Вобщем ничего из std. Также не понимает iostream
Здравствуйте! Я хотел начать изучать язык C++. Набрал литературы. Установил Microsoft Visual C++ 2005 Express Edition. Образ диска...

108
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
23.12.2019, 11:07  [ТС]
Студворк — интернет-сервис помощи студентам
Нестатические функции члены стандарт относит к отдельному типу составного типа.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.12.2019, 11:17
Цитата Сообщение от rat0r Посмотреть сообщение
Ну, второе, допустим, верно. А первое? В [basic.compound] нет специального типа для функций-членов.
а тебе обязательно нужно,
что бы в [basic.compound] был специальный тип для функций-членов,
что бы ты понял, что "функция-член" - это не "функция"?

это - разные вещи уже лишь потому,
что у них разные особенности.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.12.2019, 11:27
Цитата Сообщение от squareroot Посмотреть сообщение
Нестатические функции члены стандарт относит к отдельному типу составного типа.
В каком месте?
0
13 / 13 / 1
Регистрация: 19.10.2019
Сообщений: 607
23.12.2019, 11:32  [ТС]
Нумерация глав у разных версий стандартов разная. Данная нумерация справедлива для стандарта 11-го года.
3.9.2 Compound types
[basic.compound]
Compound types can be constructed in the following ways:
— arrays of objects of a given type, 8.3.4;
— functions, which have parameters of given types and return void or references or objects of a given
type, 8.3.5;
pointers to void or objects or functions (including static members of classes) of a given type, 8.3.1;
— references to objects or functions of a given type, 8.3.2. There are two types of references:
— lvalue reference
— rvalue reference
— classes containing a sequence of objects of various types (Clause 9), a set of types, enumerations and
functions for manipulating these objects (9.3), and a set of restrictions on the access to these entities
(Clause 11);
— unions, which are classes capable of containing objects of different types at different times, 9.5;
— enumerations, which comprise a set of named constant values. Each distinct enumeration constitutes
a different enumerated type, 7.2;
pointers to non-static class members, which identify members of a given type within objects of a given class, 8.3.3.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.12.2019, 11:42
squareroot,

Цитата Сообщение от hoggy Посмотреть сообщение
а тебе обязательно нужно,
что бы в [basic.compound] был специальный тип для функций-членов,
что бы ты понял, что "функция-член" - это не "функция"?
Что ты, конечно не обязательно. Если ты что-то заявил, то это несомненная правда.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
23.12.2019, 11:50
Цитата Сообщение от rat0r Посмотреть сообщение
TheCalligrapher, ну значит надо ещё [dcl.fct] почитать.
Хорошее замечание. Действительно, [dcl.fct] снимает все вопросы: функции-члены имеют "function type" и функция-член - это функция.

Это, однако, не снимает вышеупомянутые ограничения на использование сущностей такого типа в выражениях.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
23.12.2019, 11:55
Цитата Сообщение от rat0r Посмотреть сообщение
Что ты, конечно не обязательно. Если ты что-то заявил, то это несомненная правда
а если не кивать в мою сторону, а своими мозгами подумать?

никогда не замечал такую малююююсенькую разницу
между явлением "функции" и явлением "функцией-членом"?

совсем ничегошеньскую крохотуличку?
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
23.12.2019, 12:09
TheCalligrapher, да, у людей есть претензии к таким функциям.
3
248 / 70 / 9
Регистрация: 22.07.2018
Сообщений: 321
15.01.2020, 14:27
Цитата Сообщение от hoggy Посмотреть сообщение
"функция-член" - это не "функция"
http://eel.is/c++draft/class.mem#17.note-1
[ Note: The type of a non-static member function is an ordinary function type, and the type of a non-static data member is an ordinary object type. There are no special member function types or data member types.— end note]
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.01.2020, 16:25
Цитата Сообщение от argcargv Посмотреть сообщение
http://eel.is/c++draft/class.mem#17.note-1
ну и нафиг ты мне это показываешь?
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13210 / 6843 / 1824
Регистрация: 18.10.2014
Сообщений: 17,312
15.01.2020, 21:44
Цитата Сообщение от argcargv Посмотреть сообщение
Ценное замечание. Я почему-то его прошляпил.

После ссылки на "Abominable function types" от rat0r, у меня еще оставались сомнения: статья рассказывает о том, что можно описать abominable function types и использовать их для определения функций-членов классов. Но там как будто нет явного утверждения в обратную сторону: является ли тип готовой функции-члена класса таким abominable типом или все таки какие-то специальным типом для "функция-член класса"

А это замечание в стандарте полностью проясняет намерение авторов: тип функции-члена класса - это классический функциональный тип (возможно abominable), не какой-то специальный тип "функция-член класса".
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
15.01.2020, 23:49
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
тип функции-члена класса
не существует.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.01.2020, 15:06
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
возможно abominable
abominable означает "омерзительный". Это улучшает положение дел. Когда я впервые столкнулся с вопросом меня заинтересовало а понимают ли те кто придумал синтаксис методов класса насколько это отвратительно. И было ощущение, что не понимают. Теперь видно, математики вполне разумные люди, в определённом смысле. Просто, придерживаться единой логики в реальной, предметной области (вне математики) они не хотят. Математика - штука само дисциплинирующая, а предметная деятельность требует создания руководящего документа. Это очень сложная задача в большом проекте. Но если нет приличного тех задания то и тех-условия (стандарт) будет ещё хуже.
Метод класса Class, это обычная функция но со скрытым параметром типа Class *const. Этот прискорбный факт говорит о том, что объект класса, это в принципе (принципиально) по природе своей - левостороннее значение. Но если с этим согласиться, то нарушается равноправие классов и старых С-структур, а так же фундаментальных типов. Можно было бы оставить за структурами семантику С а классы сделать Типами Lvalue. Но решили этого не делать и спорить с природой (логики).
Беда в том, что если допустимо создание временных объектов на которые нельзя взять адрес, то нельзя сделать указатель this параметром по умолчанию для метода класса. То есть (псевдокод - не компилируется) :
C++
1
2
3
4
strucr C
{
void foo(C *const pme=this){cout<<pme;}
};
не допустим. Хотя можно было бы это разрешить, не разрешая вызов без объекта и оператора доступа, либо без передачи указателя в явном виде как параметра. Сложности с перегрузкой? Да. Есть немного. Кто-то может захотеть определить свободный метод вне класса с сигнатурой и именем типа
C++
1
void foo(C *const someObj){...}
... Ну и что? Мало не однозначностей при перегрузках? Можно завершить компиляцию с сообщением и пусть клиент сам думает. Или более драконовски - запретить так делать и всё. В конце концов функция принимающая указатели или объекты класса - часть его интерфейса и можно бы проявить жесткость в рамках стройной логики. Лучше всего было бы запретить определение функций принимающих указатель на объект последним параметром. Можно затребовать неиспользуемый параметр как это делается с некоторыми операторами, например. Параметр void очень пригодился бы.
Например:
C++
1
void foo(C *const someObj, void nothing){...}
свободная функция принимающая указатель на объект. Имя будет менглировано с гарантированным отличием от имени функции члена.
Однако сделано как сделано. Нельзя написать:
C++
1
2
3
4
struct S
{
    void fooThis(int a, S *const = this);
};
Это избавляет от проблемы вызова на временном объекте тиипа:
C++
1
S().foo();
Сейчас, такие вызовы возможны, если метод не обращается к адресу объекта.
Но такие проблемы есть у методов возвращающих ссылку на объект, например и ни кто не умер...
В общем, нельзя теперь выбрать вызвать:
C++
1
2
obj.method(a,b,c);
(&obj)->method(a,b,c);
или
C++
1
method(a,b,c, &obj);
а жаль. Теперь для связывания объекта и его метода нужны специальные приёмы. И запрещено получение адреса на метод -не статический член класса. Вернее, - создание переменной - указателя, хранящего такой адрес, вне объекта класса невозможно.
Хотя, конечно. Каждый может относиться к данному факту по своему. Я высказал свою точку зрения. Далеко не безгрешную и далеко не полную.

Добавлено через 2 часа 43 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вернее, - создание переменной - указателя, хранящего такой адрес, вне объекта класса невозможно.
То есть возможно. Но зачем?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
 
struct S{
   void foo(int a){cout<<a;}
   };
 
int main()
{
    typedef  void (S::*pfoo) (int);
    pfoo ptrfoo= &S::foo;
    cout<< ptrfoo << endl ;//фейковое значение 1 ))))
    //но у этого костыля нет доступных операций. Например нельзя:
    //(*ptrfoo)();//...error: invalid use of unary '*' on pointer to member|
    //и причина понятна
    return 0;
}
Впрочем, это применимо для доступа через объект, объявления параметра шаблона, биндинга конкретного метода к объекту... Но типом это считать нельзя. Хотя приходится.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.01.2020, 15:29
Цитата Сообщение от IGPIGP Посмотреть сообщение
cout<< ptrfoo << endl ;//фейковое значение 1 ))))
Это не фейковое значение. Это результат приведения указателя к bool.

Цитата Сообщение от IGPIGP Посмотреть сообщение
но у этого костыля нет доступных операций.
C++
1
2
3
    pfoo ptrfoo= &S::foo;
    S obj;
    (obj.*ptrfoo)(42);
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.01.2020, 16:18
Цитата Сообщение от DrOffset Посмотреть сообщение
Это не фейковое значение. Это результат приведения указателя к bool.
Да, - погорячился. Выходит адрес можно вывести так, например:
C++
1
2
 pfoo ptrfoo= &S::foo;
cout<<((void*) ptrfoo) << endl ;
Но что с ним делать вне объекта?
Цитата Сообщение от DrOffset Посмотреть сообщение
но у этого костыля нет доступных операций.
Пример который вы привели очевиден, однако это не операция на типе "указатель на метод". Это операция на объекте класса. При чём доступ оператором точка произведен по имени, который в классе отсутствует (в общем случае). То есть, в данном случае работает логика притянутая за уши. Не ваша. Вы говорите о том, что известно и реализовано в языке. Я говорю о логике реализованной в языке.
DrOffset, я не готовлю всемирное восстание. Я говорю о противоречиях, которые плохо разрешимы даже путём притягивания за уши. Уши уже километр, а люди никак не могут понять, почему указателя на функцию не достаточно для доступа к методу класса. Тут же вопрос не на уровне "системного программирования" (как говорил один из участников). Это вопрос о противоречивости абстракций уровня класса и объекта - высших уровней языка.
ps. даже цитата из стандарта пытается спорить с ... языком.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.01.2020, 16:28
Цитата Сообщение от IGPIGP Посмотреть сообщение
однако это не операция на типе "указатель на метод". Это операция на объекте класса.
Немного в сторону пример. Допустим мы сделали такой оператор +
C++
1
2
3
4
struct A
{
    int operator+(int right);
};
И применяем его так:
C++
1
2
3
4
A obj;
int v = 42;
 
int x = obj + v;
Операция на каком типе у нас? Это же бинарная операция? Очевидно, что в ней участвуют оба типа, нет?
Так в чем же разница с предыдущим примером?
Там у нас с одной стороны объект класса, а с другой - указатель. И они оба участвуют в применении операции .*. Нет?

Цитата Сообщение от IGPIGP Посмотреть сообщение
а люди никак не могут понять, почему указателя на функцию не достаточно для доступа к методу класса.
Ну вот в примере выше люди могут понять, что для того, чтобы получить x - нужно и obj и v? В чем же тогда проблема?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,038
Записей в блоге: 1
16.01.2020, 16:30
IGPIGP,
Да, - погорячился. Выходит адрес можно вывести так, например
Нельзя так делать.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.01.2020, 17:22
Цитата Сообщение от Croessmah Посмотреть сообщение
Нельзя так делать.
Croessmah, не о том речь. Можно это не только "дозволено", но и достижимо. Croessmah, этот вопрос в стороне от главного. Хотя, если вспомнить цитату о том что тип - функция (указатель или ссылка не важно) он един и нет специального типа - указатель на метод, то я привёл пример о том, что это абстракции разных уровней (как оно реализовано) и одним типом они быть не могут. Это не зависит от того, захотел кто-то это написать или нет. У обычного метода можно взять адрес, сохранить в указателе (распечатать если надо) и вызвать на нём функцию. А поскольку методы не реализованы как функции ( с возможностью явной передачи указателя или ссылки на объект) то и нельзя считать функции и не статические методы чем-то родственным по типу. Это я хотел сказать.
Цитата Сообщение от DrOffset Посмотреть сообщение
Допустим мы сделали такой оператор +
Цитата Сообщение от DrOffset Посмотреть сообщение
Операция на каком типе у нас?
Если это операция в классе - она вызывается на объекте класса. Безотносительно того, что может иметь второй аргумент. А когда она свободная - это функция а не метод. Бинарные операции типа сложения лучше делать свободными (позволяя автоматические преобразования аргументов), обычно) Но вы же понимаете о чём я говорю? Или нет?

Добавлено через 4 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Croessmah, не о том речь. Можно это не только "дозволено", но и достижимо.
О том, что размеры могут не совападать я знаю. И получить доступ к данным нужного размера (хакнуть) тоже можно. Но это частности.
0
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
16.01.2020, 17:30
Цитата Сообщение от IGPIGP Посмотреть сообщение
А поскольку методы не реализованы как функции ( с возможностью явной передачи указателя или ссылки на объект) то и нельзя считать функции и не статические методы чем-то родственным по типу
На самом деле я бы согласился с мыслью о том, что синтаксис, который предлагается для указателей на члены, несколько костыльный. Но мне не нравится ваша манера аргументировать это через отсутствие логики или неумение составлять формальные документы у членов комитета. Я убежден, что в условиях, которые были даны (а они были даны, это не то же самое, что строить язык с нуля), члены комитета сделали все, чтобы это работало максимально логично.

Более того, работа в этом направлении продолжается:
http://www.stroustrup.com/multimethods.pdf
http://www.open-std.org/jtc1/s... /n4174.pdf
http://www.open-std.org/jtc1/s... 0131r0.pdf
http://www.open-std.org/jtc1/s... /n4474.pdf
http://www.open-std.org/jtc1/s... 0079r0.pdf
http://www.open-std.org/jtc1/s... 0131r0.pdf
https://isocpp.org/files/papers/P0251R0.pdf

http://www.open-std.org/jtc1/s... 214r0.html

Цитата Сообщение от IGPIGP Посмотреть сообщение
Если это операция в классе - она вызывается на объекте класса. Безотносительно того, что может иметь второй аргумент.
По-вашему получается, что у типа int тоже нет доступных операций?
2
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
16.01.2020, 17:59
Цитата Сообщение от DrOffset Посмотреть сообщение
На самом деле я бы согласился с мыслью о том, что синтаксис, который предлагается для указателей на члены, несколько костыльный. Но мне не нравится ваша манера аргументировать это через отсутствие логики или неумение составлять формальные документы у членов комитета.
Этого мне вполне достаточно. Вопрос логики - философский вопрос. Я готов показать нелогичность (внутреннее противоречие во многих базовых концепциях языка. Тип, объект, функция. Но это большие темы. Сейчас речь именно о функциях. По настоящему мультипарадигменность + гибкость была бы возможна только при равноправии функционального вызова метода (с явной передачей ссылки объкета) и вызове на объекте. Это архи принципиальный вопрос имхо).
За ссылки - спасибо. Обязательно почитаю)
Цитата Сообщение от DrOffset Посмотреть сообщение
По-вашему получается, что у типа int тоже нет доступных операций?
Почему вы так решили?
Мы говорим о типах функций (ссылок или константных указателей - неважно) и указателей на функции.
Для типа int операцией (функцией с операторным синтаксисом вызова) является операция сложения (+) например. Но во-первых это свободная функция (зашитая но по духу). А мы же не о статических методах и свободных функциях говорим. мы говорим о нестатических методах - членах. И сравниваем их со свободными функциями. И мне кажется, чем больше будет утверждений о том что метод (н.ст.чл.) класса - это функция а не нечто особенное, тем больше будет вопросов о том, как жеж его инвокнуть...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.01.2020, 17:59

std::string код работает в VS 6.0, но не работает в VS2012 (error C4996)
Как изменился синтаксис в Visual Studio 2012 данной строки? В VS 6.0 работает, в 2012 - нет. Кто подскажет, где можно взять список...

ошибка error: cannot convert 'std::string {aka std::basic_string<char>}' to 'std::string* {aka std::basic_stri
на вод поступают 2 строки типа string. определить количество вхождений строки 2 в строку 1 ошибка error: cannot convert 'std::string {aka...

STL std::set, std::pair, std::make_pair
Я не знаю как описать тему в двух словах, поэтому не обращайте внимание на название темы. Собственно перейдем к нашим баранам: есть...

Для заданной матрицы найти такие k и n, что сумма членов k-го столбца совпадает с суммой членов n-й строки
Нужно написать фрагмент кода: Для заданной матрицы размера NхN найти такие k и n, что сумма элементов k-столбца матрицы совпадает с...

На основе исходного std::vector<std::string> содержащего числа, создать std::vector<int> с этими же числами
подскажите есть вот такая задача. Есть список . Создать второй список, в котором будут все эти же числа, но не в виде строк, а в виде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
сукцессия 43. Вторая научная статья за месяц- прайминг и гатгил
anaschu 25.07.2026
две стороны одной монеты
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru