Можно ли реализовать свойства шаблонного класса?
template<class owner_t, class value_t>
struct domen_write_only_t
{
typedef void (owner_t::*set_method_t) (const value_t &);
template<set_method_t set_method>
class property_write_only_t
{
owner_t& m_owner;
public:
property_write_only_t(owner_t& a_owner) : m_owner(a_owner) { ; }
const value_t& operator = (const value_t& a_value)
{
(m_owner.*set_method)(a_value);
return a_value;
}
};
};
class sample_t
{
private:
double m_val;
public:
void set_value(const double& a_val)
{
m_val = a_val;
}
domen_write_only_t<sample_t, double> ::
property_write_only_t <set_value> val;
sample_t(): m_val(0.), val(*this)
{
}
};
Здесь для простоты приведен пример свойства, реализующего только запись.
Возможно ли реализовать подобные свойства для шаблонного класса?
Например для класса sample2_t:
class sample2_t
{
private:
T m_val;
public:
void set_value(const T& a_val)
{
m_val = a_val;
}
sample2_t(): m_val(0)
{
}
};
Еще раз перечитай на что отвечал Green, когда я с ним не согласился, потом делись своими откровениями. Там шел разговор о добавлении свойств в stl вообще, а не той реализации которую привел автор темы.
При чем тут билдер вообще? Я его косался только в диалоге с kot_ и к дискусии с Green'ом это не имеет никакого отношения.
Я специально даю такое определение. Тут утверждалось что абсолютно любая реализация свойств вызовет переделку всей stl. Так пусть приведут хоть один пример (ведь у них такой простор для творчества) что vector придется переписать. Но даже с таким определением никто ничего не привел.
Дык, иницатор спора давно прекратил и я бы вместе с ним, но некоторый товарищи продалжают меня по очереди в чем-то убеждать. Ты вот тоже зачем-то продолжаешь эту тягомотину, пытаясь что-то мне показать.
Предположим, в простом случае. Есть свойства, кто-то их создал.
И зачем они нужны?
(аргумент "они сокращают время на набор кода" я, естественно, проигнорирую. Генерация набора методов get/set для полей класса, это несколько шоткатов, которые должны быть на кончиках пальцев).
Я не рассматриваю вообще глючность свойств. Я не рассматриваю сложность их реализации.
Просто - зачем они нужны?
Я не рассматриваю вообще глючность свойств. Я не рассматриваю сложность их реализации.
Просто - зачем они нужны?
Код пишется человеком и для человека.
Посмотрел на интерфейс класса - и видишь, вот "действия" - методы классов. А вот различные "параметры" - свойства.
get/set - это слишком примитивно. Да компилятор разворачивает определение свойства в такие методы, но главная цель - это логическая связь между этими методами, их единство.
А еще свойства помогают при отражении.
Посмотрел на интерфейс класса - и видишь, вот "действия" - методы классов. А вот различные "параметры" - свойства.
get/set - это слишком примитивно. Да компилятор разворачивает определение свойства в такие методы, но главная цель - это логическая связь между этими методами, их единство.
А еще свойства помогают при отражении.
Лично для меня в этом нету удобства. Я вижу в интерфейсе методы (среди которых выделяю, если хочу, get-set), и поля.
Впрочем, это конечно лично для меня удобство.
А что с отражением? В шарпе они играют в нем особенную роль?
Лично от вас я пока тоже ничего внятного не услышал, кроме возможных причин которые может что-то вызовут.
Были приведены не возможные, а вполне конкретные причины.
Давай по порядку, что случиться с stl если туда введут свойства. Какие преимущества из-за этого потеряются? Перечисли.
Их неоднократно перечисляли, в т.ч. и ты сам.
Не вижу смысла повторяться. (впрочем, повторился ниже)
Может не стоит меня в чем-то убеждать, не разобравщись о чем я хочу сказать?
Ну так пора уже сказать, а не хотеть. :)
Что случится с тем же std::vector? Ответ - ничего не случится, он даже не изменится.
С вектором не случиться (возможно), а вот с тем же min случится. И это тебе уже тоже говорилось и даже предлагалось провести эксперименты, но отрицать проще, чем пробовать. Не так ли?
Как я устал повторять. Были приведены аргументы глючности свойств приведенных автором темы. Как это относится к свойствам в общем виде - не вижу. Покажи.
А как я устал повторять, что были приведены аргументы глючности свойств в общем виде.
"Знаешь что такое решение задачи в общем виде? Вот тут и оно: не делая акцент на особености конкретных реализации."
Несогласен, попробуй создать свойства лишенные перечисленных недостатков.
Я не виноват, что у некоторых участников этого форума мое мнение вызывает острое отторжение и они начинают со мной спорить, при чем самое интересное, что всегда одни и те же лица.
Попытайся быть честным сам с собой, ты до сих пор не высказал своего мнения, а задавал вопросы в вызывающей форме: "Как изменят? А, ну как? А ну покажи!"
Теперь о чем собственно спор.
"Свойства" - вызов нестатического метода (оперирующего нестатическими данными этого объекта) через агрегируемый прокси-объект, создающее видимость (аналогичный синтаксис) простого обращения к полю объекта.
Т.е. другими словами, "свойства" это когда мы пишем obj.val, а это "разворачивается" в obj.func().
Так вот
1. При любой реализации "свойств", они будут багоопасны даже не по своей реализации, а по своему применению.
2. При любой реализации "свойств", они будут работать только с простыми типами.
3. При любой реализации будут ограниченно работать с существующей STL.
4. При любой реализации потребуется расширить существующие интерфейсы STL.
5. При любой реализации "свойства" не вписываются в концепцию STL.
6. При любой реализации свойства нельзя будет использовать там, где можно будет использовать обычное обращение к полю класса, и это вызовет путаницу.
7. При любой реализации "свойства" ставят под удар принцип "инкапсуляции".
Вывод: даже если такую библиотеку-монстр можно будет реализовать, то пользоваться ей надо будет с такой осторожностью, а ошибки находить на столько сложно, что это сведет на нет все преимущества STL.
Как я понял ход твоих мыслей.
Если глючные свойства будут включены в STL, то это никак не отразиться на глючности остальной STL
Но ведь свойства станут частью STL, а известно, если в бочку меда добавить ложку дерьма, то получим не "бочку меда с ложкой дерьма", а "бочку дерьма".
Кроме того "остальная часть" STL разрастется и это тоже скажется на качестве библиотеки вцелом.
Поля на сколько я знаю всегда делают приватными.
В общем виде, .NET позволяет отражать методы и свойства раздельно. Т.е. существует два разных метода у класса System.Type: GetProperties и GetMethods (ну и для полей - GetFields).
Подход со свойствами удобнее, когда осуществляется привязка данных (наборов некоторых объектов) к интерфейсу (контрол для отображения набора на форме или веб-странице): мы указываем именно имя свойства, которое привязываем. Применение свойств также обосновано, когда мы имеем дело с XML: тег соответствует классу, атрибуты - свойствам.
Сорри, оговорился, имел в виду -- просматриваю структуру класса (в какой-то панели IDE).
Но, по большому счёту, свойства - как спа-салон: реальной пользы мало, но приятно безумно.
Эта фраза относилась лично nikitozz'у. Вообще странно что ты отвечаешь на сообщение адресованное не тебе.
Свойства не "сведут на нет" и не "сломают" stl.
С ним вообще ничего не случиться.
И с min не "сломается". Конечно, внешнии по отношению к stl "свойства" не будут работать с min. Ведь stl в данном случае ничего не знает о свойствах, однако если они будут частью stl min будет прекрасно о них известно. Т.е. min будет работать со свойствами. Мы же говорим об этом.
Единственный подкрепленный кодом аргумент глючности свойств в общем виде был аргумент про sizeof(). Однако какой смысл брать у своства размер? Это все равно что применять sizeof к string или iostream. Ты же не будешь этого делать? Остальные аргументы были про глючность свойств приведенных автором в текущей stl.
Несогласен, попробуй создать свойства лишенные перечисленных недостатков.
Т.е. в общем виде доказетльств предоставить ты не можешь кроме спорного аргумента про sizeof?
Попытайся буть честным с собой, ты до сих пор не покзал почему min сведется на нет если в stl включат "свойства". Ты доказываешь сведение на нет предположениями не подкрепленными кодом.
"Свойства" - вызов нестатического метода (оперирующего нестатическими данными этого объекта) через агрегируемый прокси-объект, создающее видимость (аналогичный синтаксис) простого обращения к полю объекта.
Т.е. другими словами, "свойства" это когда мы пишем obj.val, а это "разворачивается" в obj.func().
Сразу возникает вопрос почему obj.func(), а не setter::func(obj), например?
1. При любой реализации "свойств", они будут багоопасны даже не по своей реализации, а по своему применению.
Багоопасны почти все инструменты stl.
Не совсем понимаю о чем ты. Поясни.
А это тут при чем? Разговор совсем не об этом.
Ну и что с того?
Да ну, в чем-же?
Какую путаницу? Приведи пример.
s может быть как stirng, так и char*, так и void*. Не долго и запутаться. :)
Не в коем разе. Если для тебя инкапсуляция это только прятанье пременных в private/protected и работа с ними через методы, то тогда конечно.
Вывод: даже если такую библиотеку-монстр можно будет реализовать, то пользоваться ей надо будет с такой осторожностью, а ошибки находить на столько сложно, что это сведет на нет все преимущества STL.
Вот, например, нади ошибку здесь:
string s = "Hello" + 'o';
Если глючные свойства будут включены в STL, то это никак не отразиться на глючности остальной STL
Но ведь свойства станут частью STL, а известно, если в бочку меда добавить ложку дерьма, то получим не "бочку меда с ложкой дерьма", а "бочку дерьма".
Сильная метафора, однако stl это уже мед с примесью дермеца.
Да ну. Как размер библиотеки сказывается на качестве? Размер boost'а видел?
Свойства не "сведут на нет" и не "сломают" stl.
Что ты подразумеваешь под "сведут на нет" и "сломают" stl ?
С ним вообще ничего не случиться.
Докажи в общем случае.
И с min не "сломается". Конечно, внешнии по отношению к stl "свойства" не будут работать с min. Ведь stl в данном случае ничего не знает о свойствах,
Так все же min придется перерабатывать, как и остальную STL? Просто "добавить" свойства не получится?
Что значит "не знает о свойствах"?
vector тоже ничего не знает о string и тем более о "внешних классах", однако работает с ними.
однако если они будут частью stl min будет прекрасно о них известно. Т.е. min будет работать со свойствами.
Что значит "прекрасно будет о них известно"?
Единственный подкрепленный кодом аргумент глючности свойств в общем виде был аргумент про sizeof().
Это единственный аргумент который ты понял. А вот аргумент про параметр шаблона функции, например min, ты не понял.
Это касается всех ф-ций, не только из stl.
Однако какой смысл брать у своства размер? Это все равно что применять sizeof к string или iostream. Ты же не будешь этого делать?
Скажи, пожалуйста, я могу сделать так?
Почему не могу, если это просто поле класса?
Как ты разграничишь это между полями и свойствами?
Остальные аргументы были про глючность свойств приведенных автором в текущей stl.
Докажи. Я утверждаю обратное.
Приведи свои аргументы обраьного.
Попытайся буть честным с собой, ты до сих пор не покзал почему min сведется на нет если в stl включат "свойства".
Где я утверждал, что "min сведется на нет" ?
Ты доказываешь сведение на нет предположениями не подкрепленными кодом.
Там где необходимо код приводится, общие случаи аргументируются ограничениями языка.
Где доказательства твоих предположений? Где код?
Сразу возникает вопрос почему obj.func(), а не setter::func(obj), например?
Потому, что мы обсуждаем "свойства" именно с такой общепринятой трактовкой.
Имеешь другую трактовку, обсуждай её в отдельной теме.
Багоопасны почти все инструменты stl.
Докажи.
Не совсем понимаю о чем ты. Поясни.
Невозможно создать свойство для классов и пр. "составных" объектов.
Только для простых типов - int, float, char и т.п., указатели и массивы.
А это тут при чем? Разговор совсем не об этом.
А о чем?
Ну и что с того?
Да ну, в чем-же?
Ответы дан в теме неоднократно выше.
Какую путаницу? Приведи пример.
Ответ дан неоднократно в т.ч. в этом посте, см. выше.
Не в коем разе. Если для тебя инкапсуляция это только прятанье пременных в private/protected и работа с ними через методы, то тогда конечно.
Докажи, что "не в коем разе". Именно "не в коем".
Вот, например, нади ошибку здесь:
string s = "Hello" + 'o';
Эта ошибка не имеет никакого отношения к stl.
Сильная метафора, однако stl это уже мед с примесью дермеца.
Добавим ещё? Это пойдет STL на пользу?
Да ну. Как размер библиотеки сказывается на качестве? Размер boost'а видел?
Если stl - "мед с при с примесью дермеца", то boost - сточная канава. И размер в т.ч. имеет значение.
А ты размер MFC видел?
То, что невозможно будет пользоваться библиотекой. А ты?
Покажи обратное. Как я тебе докужу что не существует, то что не существует? Можно доказать существование чего-то показав это, но не несуществование чего-то показав что-то.
Что значит "не знает о свойствах"?
vector тоже ничего не знает о string и тем более о "внешних классах", однако работает с ними.
А кто сказал, что они буду добавлены просто как дополнительный класс без изменения других компонентов?
Значит будут внесены дополнительные декаларации, если это потребуется.
Это касается всех ф-ций, не только из stl.
Я понял все твои аргументы. Я не вижу как это доказывает что stl "сведется на нет".
Почему не могу, если это просто поле класса?
Можешь. А если val это string или iostream ты будешь так делать? Зачем?
Никак, а зачем мне это разграничивать, если согласно принципу инкапсуляции у меня есть только интерфейс и только через него я должен работать с объектом?
void max(T,T);
max(obj.val, 6);
В данном случае придется использовать max<int>(obj.val, 6). Только где тут stl с реализованными свойствами?
func(obj.val);
Ну как быть в данном случае ты и сам знаешь. operator T& () никто не отменял. :)
Приведи свои аргументы обраьного.
Ну ты же не знаешь как изменится min после того как туда добавят свойства? Т.е. все что приведено - по поводу текущей всерсии stl, остальное - это софистика.
Подумаешь, описался. Перефразируем:
Попытайся быть честным с собой, ты до сих пор не покзал почему stl сведется на нет если в stl включат "свойства".
Ты показал проблемы в использовании свойств автора темы и несовместимость их с частью библиотеки stl.
Там где код придумал он приводиться, а тем где не придумал - не приводиться. :)
Внимание, цитата:
Где я что-либо предполагаю или доказываю?
Имеешь другую трактовку, обсуждай её в отдельной теме.
Опять эта общепринятая трактовка! :D
Где в теме говориться об этой "общепринятой трактовке"?
Почему ты считаешь что свойства обязаны привязыватся к нестатическим методам? Что мешает свойствам в общем виде привязыватся к статическим?
Только для простых типов - int, float, char и т.п., указатели и массивы.
Возможно создать свойство, но не полуится получить доступ к членам этой структуры через оператор . примененный к объекту свойства.
Но что случится с stl в данном случае? Это вообще никак не доказывает, что stl "сведется на нет" или "сломается" после введения в нее "свойств".
Я где-то доказываю обратное? Как это доказывает то, что stl сломается?
Стандартная отмазка.
Как доказывает необходимость изменить stl, то что stl "сломается"? Никак!
Да и огласите "концепцию stl", а то эту свещенную корову все доят по поводу и без повода.
Ну если ты не видешь принципиальной разницы между полем и свойством, то конечно можно запутаться.
Ну и как свойства нарушают инкапсуляцию? Ответ: Никак.
Так же как и многое приведенное тобой. :)
Кто говорит про пользу?
Т.е. boost ты не используешь и другим не советуешь?
MFC это не библиотека шаблонов.
То, что невозможно будет пользоваться библиотекой. А ты?
Что подразумеваю я, я уже говорил.
А что значит, "невозможно будет пользоваться"? Почему?
Покажи обратное. Как я тебе докужу что не существует, то что не существует? Можно доказать существование чего-то показав это, но не несуществование чего-то показав что-то.
Я сказал не "показать", а "доказать".
Ты же утверждаешь, что с вектором "вообще ничего не случится", а вот доказать этого не можешь.
Сл-но голословное утверждение.
Можешь. А если val это string или iostream ты будешь так делать? Зачем?
Возможно и буду. И получу размер полей этого типа. И путанницы тут не будет.
А вот что я получу взяв sizeof val.obj не понятно.
Особенно это скажется на рефакторинге.
В данном случае придется использовать max<int>(obj.val, 6).
Ты всегда пишешь func<int>(arg1, arg2) ? :)
И даже если аргументов больше двух?
Только где тут stl с реализованными свойствами?
Вот видишь, ты уже путаешься. obj.val - это "свойство". Не узнал?
Ну как быть в данном случае ты и сам знаешь. operator T& () никто не отменял.
Я то знаю, поэтому и спросил. А ты вот на эти грабли наступил.
Надеюсь свой баг найдешь сам.
Ну ты же не знаешь как изменится min после того как туда добавят свойства? Т.е. все что приведено - по поводу текущей всерсии stl, остальное - это софистика.
Я утверждал, что глючность свойств не зависит от STL.
Ты с этим споришь, но доказать обратного не можешь?
Ты показал проблемы в использовании свойств автора темы и несовместимость их с частью библиотеки stl.
Я ссылался на свойства автора темы? Где?
Я базировался в своих рассуждениях на его реализации? Где?
Внимание, цитата:
Где я что-либо предполагаю или доказываю?
Внимание цитатЫ:
[QUOTE=Nixus]
Наличие свойств в stl никак не скажется на остальных компонентах stl в плане совместимости с версией без свойств.
однако их наличие там не сломет (как утверждают некоторые) и не сведет на нет саму билиотеку.
Нарушена концепция, если и будет, то только по отношениюк свойствам, остальные компоненты останутся такими же какие были. Т.е. не сведутся на нет и не сломаются.
В данном случае с библиотекой ничего трагического не произойдет, она будет работать как работала.
Я говорю, что если свойства введут в stl ничего c stl не случится.
По моему, я чеко выразил свою позицию. Введение свойств в stl не сведет ее на нет, т.е. библиотека не сломается.
Свойства не "сведут на нет" и не "сломают" stl.
С ним вообще ничего не случиться.
[/QUOTE]
Это даже не предположения, а утверждения. А доказательст, действительно, нет. :)
[QUOTE=Nixus]
Почему ты считаешь что свойства обязаны привязыватся к нестатическим методам? Что мешает свойствам в общем виде привязыватся к статическим?
[/QUOTE]
А какой смысл привязывать "свойства" к статическим методам?
[QUOTE=Nixus]
Возможно создать свойство, но не полуится получить доступ к членам этой структуры через оператор . примененный к объекту свойства.
[/QUOTE]
Здорово, а зачем нам такое свойство?
[QUOTE=Nixus]
Да и огласите "концепцию stl", а то эту свещенную корову все доят по поводу и без повода.
[/QUOTE]
Ну ты ввел в обсуждение "концепцию", тебе и объяснять. :)
[QUOTE=Nixus]
Ну и как свойства нарушают инкапсуляцию? Ответ: Никак.
[/QUOTE]
Докажи.
[QUOTE=Nixus]
Так же как и многое приведенное тобой.
[/QUOTE]
Если ты вводишь "свойства" в STL, это автоматически будет иметь к STL отношение.
[QUOTE=Nixus]
Т.е. boost ты не используешь и другим не советуешь?
[/QUOTE]
Крайне ограничено. И другим советую хорошенько подумать, прежде, чем использовать.
[QUOTE=Nixus]
MFC это не библиотека шаблонов.[/QUOTE]
Boost, кстати, тоже не библиотека шаблонов.