Здравствуйте, Аноним, Вы писали:
А>Стандарт уже содержит все, что нужно.
Что именно ты имеешь ввиду? То, что указанную проблему можно обойти — я знаю. Вопрос только в удобстве и практике. А практика такая, что современные популярные компиляторы с идущими вместе с ними STL имеют вполне реальные проблемы с этим самым bind2nd и т.п.
Как все запущенно...
Re[6]: C++ дополнения
От:
Аноним
Дата:
09.06.03 12:16
Оценка:
Здравствуйте, Владик, Вы писали:
В>... современные популярные компиляторы с идущими вместе с ними STL имеют вполне реальные проблемы с этим самым bind2nd и т.п.
Значит, надо улучшать степень соответствия существующих компиляторов стандарту, а не изменять стандарт.
Здравствуйте, Аноним, Вы писали:
А>Значит, надо улучшать степень соответствия существующих компиляторов стандарту, а не изменять стандарт.
Видишь ли, разработчиков STL тоже можно понять — писать в 2 раза больше (если не в 5) никому не хочется, когда и так "как-то" работает. Тоже самое, кстати, касается и return void — конструкция бредовая, зато "дешево, надежно и практично".
Здравствуйте, WolfHound, Вы писали:
W> Предлагаю в этой ветке собрать все что по вашему мнению нужно W> добавить в стандарт. После чего послать запрос комитетчикам.
Не надо. Просто запросов "хочу фичу" в комитет в той или иной форме приходит много. Все они
в конечном итоге игнорируются по одной простой причине: одного желания "фичи" недостаточно.
Кто-то должен проделать всю грязную работу по созданию тестовой реализации и разработке точной
спецификации. Если "хотетель" не может найти кого-нибудь, кто сделает хотя бы первую часть
работы, шансов убедить комитет сделать остальное у него, фактически, нет. Кроме того, желание
что-нибудь добавлять в язык, имхо, должно сопровождаться желанием отслеживать работу комитета
по обработке соответствующих предложений.
W> 1)template typedef
Уже есть formal proposal http://anubis.dkuug.dk/jtc1/sc22/wg21/docs/papers/2002/n1406.pdf.
Остается сидеть и ждать результатов (будет включено, или нет в следующую версию). При
желании можно помочь авторам formal proposal в уточнениях и дополнениях, или предложить
альтернативное видение в виде другого formal proposal, но уж никак не "хочу фичу".
W> 2)Атрибут на функцию обязательна к определению во ВСЕХ потомках
Без детальной спецификации, включающей описание решаемых проблем, стоимость реализации,
требуемые изменения в стандарте и т.п. — никаких шансов на включение. Разве что можно
ждать, пока кто-нибудь другой предоставит в комитет проработанный formal proposal.
W> 3)Статические конструкторы/деструкторы. Должны быть созданы для ВСЕХ W> полных инстационирований шаблона.
Аналогично.
W> 4)Анонимные методы те Создается функтор который имеет доступ к локальным переменным W> Тоже но еще может достучатся до не статических челенов класса
Это не так просто, как кажется. Насколько я знаю, у многих есть твердое желание иметь
подобную функциональность в языке, но есть серьезные вопросы, на которые нет однозначных
ответов: можно ли возвращать полученные подобным образом объекты из функций, если да,
то как будет освобождаться память этого объекта, как гарантировать невозможность доступа
к контексту закончившей выполнение функции и т.п.
W> 5)Добавить в STL сигнатуры типа W>
W> template<class T, class F>
W> F for_each(T& t, F f)
W>
Большой вопрос, стоит ли усложнять интерфейс библиотеки без добавления новой
функциональности. Кроме того, в некоторых случаях количество перегруженных
шаблонов растет нелинейно, и далеко не во всех случаях в принципе существует
возможность предоставить подобные интерфейсы. Например:
// [01]template<class InputIterator1, class InputIterator2>
bool includes(InputIterator1, InputIterator1, InputIterator2, InputIterator2);
// [02]template<class InputIterator1, class InputIterator2, class BinaryPredicate>
bool includes(InputIterator1, InputIterator1, InputIterator2, InputIterator2, BinaryPredicate);
// сюда нужно добавить шесть перегруженных вариантов:
// [1]template<class Container1, class InputIterator2>
bool includes(const Container1&, InputIterator2, InputIterator2);
// [2]template<class InputIterator1, class Container2>
bool includes(InputIterator1, InputIterator1, const Container2&);
// [3]template<class Container1, class Container2>
bool includes(const Container1&, const Container2&);
// [4]template<class Container1, class InputIterator2, class BinaryPredicate>
bool includes(const Container1&, InputIterator2, InputIterator2, BinaryPredicate);
// [5]template<class InputIterator1, class Container2>
bool includes(InputIterator1, InputIterator1, const Container2&, BinaryPredicate);
// [6]template<class Container1, class Container2, class BinaryPredicate>
bool includes(const Container1&, const Container2&, BinaryPredicate);
При этом, как можно заметить, вариант 1 конфликтует
с вариантоми 2 и 6, а вариант 4 — c 01 и 5.
W> 6)Добавить boost::shared_ptr и компанию
W> //Не могут быть определены конструкторы/деструктор
W> //но пустые protected виртуальный деструктор, конструктор по умолчанию,
W> //копирующий конструктор, копирующие присваивание создюется автоматически
W> //Может быть наследован только от интерфейса(ов)
W> //Не может содержать данные
W>
Не пойму, почему это нельзя реализовать через public virtual наследование?
W> Что забыл?
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, WolfHound
WH>Что забыл?
Мне например, больше всего нехватает хэщей.
А из тог, что ты перечислил, по моему, самое полезное — boost::lambda.
If the milk turns out to be sour,
I ain't the kind of pussy to drink it
Здравствуйте, Павел Кузнецов, Вы писали:
ПК>Это не так просто, как кажется. Насколько я знаю, у многих есть твердое желание иметь ПК>подобную функциональность в языке, но есть серьезные вопросы, на которые нет однозначных ПК>ответов: можно ли возвращать полученные подобным образом объекты из функций,
Нет ибо эти обьекты имею доступ к контексту функции. Болие того они становятся не валидными при выходе из облости видимости те
void(*fnPtr)(int);
{
int i=0;
fnPtr=void(int x)//Создается не видимый, автоматический (не временный) обьект
{
i+=x;
};
//Тут валидно
{
//Тут валидно
}
//Тут валидно
}
//Тут невалидно
//И вобще он уже разрушился
ПК>если да, то как будет освобождаться память этого объекта, как гарантировать невозможность доступа ПК>к контексту закончившей выполнение функции и т.п.
ИМХО из серии
Some& Fumc()
{
Some some;
return some;
}
Наступил — сам дурак.
ПК>Большой вопрос, стоит ли усложнять интерфейс библиотеки без добавления новой ПК>функциональности.
Ну сокращение клиентского кода ИМХО вещь не маловажная.
ПК>Кроме того, в некоторых случаях количество перегруженных ПК>шаблонов растет нелинейно, и далеко не во всех случаях в принципе существует ПК>возможность предоставить подобные интерфейсы. Например:
Уверен?
А VC++7.1 с тобой не согласен.
template<class T, class U>
void Test(T, T, U)
{
std::cout<<"(T, T, U)"<<std::endl;
}
template<class T, class U>
void Test(T, U, U)
{
std::cout<<"(T, U, U)"<<std::endl;
}
template<class T, class U, class D>
void Test(T, U, D)
{
std::cout<<"(T, U, D)"<<std::endl;
}
template<class T, class U, class D>
void Test(T, U, U, D)
{
std::cout<<"(T, U, U, D)"<<std::endl;
}
template<class T, class U, class D>
void Test(T, T, U, D)
{
std::cout<<"(T, T, U, D)"<<std::endl;
}
template<class T, class U>
void Test(T, T, U, U)
{
std::cout<<"(T, T, U, U)"<<std::endl;
}
int main()
{
int i=0;
float f=0;
double d=0;
Test(i, i, f);
Test(i, f, f);
Test(i, f, d);
Test(i, i, f, f);
Test(i, i, f, d);
Test(i, f, f, d);
return 0;
}
Откомилировалось без единого warning'а
Вывод
(T, T, U)
(T, U, U)
(T, U, D)
(T, T, U, U)
(T, T, U, D)
(T, U, U, D)
ПК>Имхо, несколько конфликтует с (4).
Есть не много однако приятней написать так
int sum=0;
for_each(vec, sum+=_1);
//Чем так
for_each(vec, void(int i)
{
sum+=i;
}
);
Хотя при наличии анонимных методов lambda уже не так спасает.
ПК>Не пойму, почему это нельзя реализовать через public virtual наследование?
Оно вроде какбы медленней. К томуже с интерфейсами понятней и не забудишь про virtual.
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
ПК>> Кроме того, в некоторых случаях количество перегруженных ПК>> шаблонов растет нелинейно, и далеко не во всех случаях в принципе ПК>> существует возможность предоставить подобные интерфейсы. Например:
W> Уверен? W> А VC++7.1 с тобой не согласен <...>
Это не совсем то, что я написал Например, у тебя происходит копирование
контейнеров для вызова каждого алгоритма. Хотя, конфликтов, возможно, чуть
меньше, чем я указал, они, все же есть:
template<class T, class U>
void Test(T, T, const U&)
{
std::cout<<"(T, T, U)"<<std::endl;
}
template<class T, class U>
void Test(const T&, U, U)
{
std::cout<<"(T, U, U)"<<std::endl;
}
template<class T, class U, class D>
void Test(const T&, const U&, D)
{
std::cout<<"(T, U, D)"<<std::endl;
}
template<class T, class U, class D>
void Test(const T&, U, U, D)
{
std::cout<<"(T, U, U, D)"<<std::endl;
}
template<class T, class U, class D>
void Test(T, T, const U&, D)
{
std::cout<<"(T, T, U, D)"<<std::endl;
}
template<class T, class U>
void Test(T, T, U, U)
{
std::cout<<"(T, T, U, U)"<<std::endl;
}
int main()
{
int i=0;
float f=0;
double d=0;
Test(i, i, f);
Test(i, f, f);
Test(i, f, d);
Test(i, i, f, f);
Test(i, i, f, d);
Test(i, f, f, d);
return 0;
}
Comeau C/C++ 4.3.0.1 (Aug 21 2002 15:45:32) for MS_WINDOWS_x86
Copyright 1988-2002 Comeau Computing. All rights reserved.
MODE:strict warnings C++
"test.cpp", line 39: error: more than one instance of overloaded function
"Test" matches the argument list:
function template "Test(T, T, const U &)"
function template "Test(const T &, const U &, D)"
argument types are: (int, int, float)
Test(i, i, f);
^
"test.cpp", line 40: error: more than one instance of overloaded function
"Test" matches the argument list:
function template "Test(const T &, U, U)"
function template "Test(const T &, const U &, D)"
argument types are: (int, float, float)
Test(i, f, f);
^
"test.cpp", line 43: error: more than one instance of overloaded function
"Test" matches the argument list:
function template "Test(T, T, const U &, D)"
function template "Test(T, T, U, U)"
argument types are: (int, int, float, float)
Test(i, i, f, f);
^
3 errors detected in the compilation of "test.cpp".
Posted via RSDN NNTP Server 1.5 beta
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
W>> Уверен? W>> А VC++7.1 с тобой не согласен <...>
ПК>Это не совсем то, что я написал Например, у тебя происходит копирование ПК>контейнеров для вызова каждого алгоритма. Хотя, конфликтов, возможно, чуть ПК>меньше, чем я указал, они, все же есть:
VC++7.1 и это нормально схавал
А ссылку на стандарт где говорится что это не должно компилиться можно?
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Вот в что раскручивается вызов memset для этого случая
Как видите умный компилятор понял что длина блока памяти кратна длине DWORD
и достаточно одного цикла rep stosd
00000 57 push edi
00001 8b 7c 24 08 mov edi, DWORD PTR _d$[esp]
00005 b9 06 00 00 00 mov ecx, 6
0000a 33 c0 xor eax, eax
0000c f3 ab rep stosd
0000e 5f pop edi
0000f c3 ret 0
void func(double *d, int n)
{
memset(d, 0, n * sizeof(double));
}
Ну а в этом случае компилятору уже не хватило сообразительности
что произведение n * sizeof(double) все равно кратно длине DWORD
и он по сути вставил в генерируемый код лишние инструкции
00000 8b 44 24 08 mov eax, DWORD PTR _n$[esp-4]
00004 57 push edi
00005 8b 7c 24 08 mov edi, DWORD PTR _d$[esp]
00009 8d 0c c5 00 00
00 00 lea ecx, DWORD PTR [eax*8]
00010 33 c0 xor eax, eax
00012 8b d1 mov edx, ecx
00014 c1 e9 02 shr ecx, 2
00017 f3 ab rep stosd
00019 8b ca mov ecx, edx //лишнее
0001b 83 e1 03 and ecx, 3 //лишнее
0001e f3 aa rep stosb //лишнее
00020 5f pop edi
00021 c3 ret 0
WH>А ссылку на стандарт где говорится что это не должно компилиться можно?
А мне так кажется, что ссылка на стандарт тут не обязательна — КОМО очень информативные сообщения об ошибках выдал
"test.cpp", line 39: error: more than one instance of overloaded function
"Test" matches the argument list:
function template "Test(T, T, const U &)"
function template "Test(const T &, const U &, D)"
argument types are: (int, int, float)
Test(i, i, f);
Ведь согласись, все очевидно.
Of course, the code must be complete enough to compile and link.
Здравствуйте, Lorenzo_LAMAS, Вы писали:
LL>А мне так кажется, что ссылка на стандарт тут не обязательна — КОМО очень информативные сообщения об ошибках выдал
хъ LL>Ведь согласись, все очевидно.
Я читать умею. Но ты на 100% уверен что комо всегда прав? ИМХО это нельзя сказать ни об одном компиляторе.
... << RSDN@Home 1.0 beta 6a >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн