Re[4]: Почему нет и планируется ли расширения в цпп?
От: sokel Россия  
Дата: 28.10.11 10:07
Оценка:
Здравствуйте, k.o., Вы писали:

KO>Здравствуйте, sokel, Вы писали:


S>>А в плане инкапсуляции хотелось бы такого сахара — назначать member функциям права доступа. Т.е. те функции которые вроде как надо бы static non-member'ами делать всё таки писать как member, но с ограниченными правами доступа к this, т.е. что то типа void foo(...) : public { ... } При этом получая уверенность, что эта неконстантная member-функция сможет изменить состояние объекта класса только через public интерфейс.


KO>Зачем?


Ну... я ж говорю — сахару хочется По хорошему конечно такие функции, которым для работы достаточно public данных надо выносить из класса. Но для этого надо какой то namespace завести, названия придумать. Куда как проще когда оно вызывается как member-функция. Но при этом нет уверенности что они, используя привелегии member функций с данными как нибудь не так будут работать. Например, к полям не через аксессоры а напрямую обращаться.
Re[5]: Почему нет и планируется ли расширения в цпп?
От: sokel Россия  
Дата: 28.10.11 10:17
Оценка:
S>Ну... я ж говорю — сахару хочется По хорошему конечно такие функции, которым для работы достаточно public данных надо выносить из класса. Но для этого надо какой то namespace завести, названия придумать. Куда как проще когда оно вызывается как member-функция. Но при этом нет уверенности что они, используя привелегии member функций с данными как нибудь не так будут работать. Например, к полям не через аксессоры а напрямую обращаться.

Т.е. чтобы например вместо t_result do_some_complex_object_analysis(const t_object&) можно было писать t_result t_object::do_some_complex_analysis() не нарушая инкапсуляции.
Re[2]: Почему нет и планируется ли расширения в цпп?
От: Caracrist https://1pwd.org/
Дата: 28.10.11 18:15
Оценка:
Здравствуйте, sokel, Вы писали:

S>
S>// общий метод
S>template<typename T> SYSTEMTIME to_systemtime(const T& obj) { obj.to_systemtime(); }
S>// ну а дальше расширения
S>SYSTEMTIME to_systemtime(const my_time_t& obj) { ... }
S>


Допустим с написав дополнительных функций, менможко темплейтной магии, заучив все правила ADL и не забыв написать весь код с самого начала расчитывая на такой поворот событий (например, темплейт уже обращающийся к мемберу придётся переписывать), можно отказавшись от чисто эстетического момента, казалось бы, решить все проблемы по другому. Выше, тут уже привели не мало советов — как.
А что предлогаете делать с интелисенсом? А вы уверены что эти функции расширяющие интерфейс я вообще найду и не напишу лишний раз решение той же проблемы... Не заводить же мне для каждого класса теперь отдельный namespace
~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: Почему нет и планируется ли расширения в цпп?
От: Caracrist https://1pwd.org/
Дата: 07.11.11 12:47
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>Здравствуйте, sokel, Вы писали:


S>>
S>>// общий метод
S>>template<typename T> SYSTEMTIME to_systemtime(const T& obj) { obj.to_systemtime(); }
S>>// ну а дальше расширения
S>>SYSTEMTIME to_systemtime(const my_time_t& obj) { ... }
S>>


C>Допустим с написав дополнительных функций, менможко темплейтной магии, заучив все правила ADL и не забыв написать весь код с самого начала расчитывая на такой поворот событий (например, темплейт уже обращающийся к мемберу придётся переписывать), можно отказавшись от чисто эстетического момента, казалось бы, решить все проблемы по другому. Выше, тут уже привели не мало советов — как.

C>А что предлогаете делать с интелисенсом? А вы уверены что эти функции расширяющие интерфейс я вообще найду и не напишу лишний раз решение той же проблемы... Не заводить же мне для каждого класса теперь отдельный namespace

Вот такой хак
#define INTELLISENSE_MARKER(static_name, ...) template<void* static_name> void

// example
struct X {
    INTELLISENSE_MARKER(X_func) func();
    int h;
};
int X_func(const X&x)
{  
   return x.h;
}


Если нечайно написать:
X x;
x.func();

то получаем достаточно информативную ошибку:

error C2783: 'void X::func(void)' : could not deduce template argument for 'X_func'

~~~~~
~lol~~
~~~ Single Password Solution
Re[3]: Почему нет и планируется ли расширения в цпп?
От: igna Россия  
Дата: 08.11.11 06:27
Оценка:
Здравствуйте, Caracrist, Вы писали:

C>С тем же успехом любую функцию принимающую указатель или ссылку на объект в качестве (первого?) параметра, можно назвать частью интерфейса. Но что-то подсказывает мне, что это не так.


А на самом деле это так. См. например Саттер, Решение сложных задач на C++, Задача 5.2. Поиск имен и принцип интерфейса. Можно не согласится с Саттером (и многими другими), но по крайней мере знать эту точку зрения стоит хотя бы для понимания того, почему в C++ нет функций-расширений.
Re[4]: Почему нет и планируется ли расширения в цпп?
От: uzhas Ниоткуда  
Дата: 08.11.11 06:44
Оценка:
Здравствуйте, uzhas, Вы писали:

U>это C++way

кстати, некий сахар уже есть: вспомним механизм работы operator<<
но, как водится, не генерик подход
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.