Добавить константность объекту
От: igna Россия  
Дата: 08.09.11 12:31
Оценка:
Есть ли в Boost-е шаблон позволяющий добавить константность объекту?:

    template <class T>
    T const& as_const(T& x)
    {
        return x;
    }
Re: Добавить константность объекту
От: Кодт Россия  
Дата: 08.09.11 12:58
Оценка: 2 (1)
Здравствуйте, igna, Вы писали:

I>Есть ли в Boost-е шаблон позволяющий добавить константность объекту?:


Есть шаблоны, добавляющие-отнимающие константность у типа. (см. type_traits/add_const.hpp и т.п.)
А красивых const-cast'ов нет почему-то.

По моему опыту, удобно определить сразу комплекты для ссылок, указателей и умных указателей
template<class T> T const&            add_const_ref(T& t) { return t; }
template<class T> T const*            add_const_ptr(T* t) { return t; }
template<class T> shared_ptr<T const> add_const_sptr(shared_ptr<T> const& t) { return t; }

template<class T> T&            remove_const_ref(T const& t) { return const_cast<T&>(t); }
template<class T> T*            remove_const_ptr(T const* t) { return const_cast<T*>(t); }
template<class T> shared_ptr<T> remove_const_sptr(shared_ptr<T const> const& t) { return const_pointer_cast<T>(t); }


(пользуясь административным ресурсом, поправил опечатку — правильно расставил const)
Перекуём баги на фичи!
Re[2]: Добавить константность объекту
От: gegMOPO4  
Дата: 08.09.11 13:36
Оценка: :)
Здравствуйте, Кодт, Вы писали:
К>По моему опыту, удобно определить сразу комплекты для ссылок, указателей и умных указателей

А как быть с ссылками на указатель?
Re[3]: Добавить константность объекту
От: Кодт Россия  
Дата: 08.09.11 14:28
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

MOP>Здравствуйте, Кодт, Вы писали:

К>>По моему опыту, удобно определить сразу комплекты для ссылок, указателей и умных указателей

MOP>А как быть с ссылками на указатель?


Если хочешь снять константность со ссылки на {указатель / умный указатель / что угодно ещё} — применяешь remove_const_ref.
char buf[] = "hello";

char const* ptr = buf;
char const* const& ref = ptr;

// нельзя
ref[4] = '?';
remove_const_ptr(ref) = "heaven!";
ref = "heaven!";

// можно
remove_const_ptr(ref)[4] = '?';    // char*          - получаем buf = ptr = "hell?"
remove_const_ref(ref) = "heaven!"; // char const* &  - получаем buf = "hell?", ptr = "heaven!"
remove_const_ptr(ref)[0] = 'l';    // char*          - получаем расстрел памяти "leaven!"
Перекуём баги на фичи!
Re[4]: Добавить константность объекту
От: Alexander Poluektov Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 08.09.11 14:39
Оценка:
Здравствуйте, Кодт, Вы писали:

К>>>По моему опыту, удобно определить сразу комплекты для ссылок, указателей и умных указателей


MOP>>А как быть с ссылками на указатель?


К>Если хочешь снять константность со ссылки на {указатель / умный указатель / что угодно ещё} — применяешь remove_const_ref.


Это все семечки.
Я бывает, наоборот -- константность с указателя на ссылку снимаю, так всем отделом потом обратно надевают!
Re[5]: Добавить константность объекту
От: Кодт Россия  
Дата: 08.09.11 15:08
Оценка:
Здравствуйте, Alexander Poluektov, Вы писали:

AP>Это все семечки.

AP>Я бывает, наоборот -- константность с указателя на ссылку снимаю, так всем отделом потом обратно надевают!

Достаточно просто сделать указатель на ссылку, чтобы потом весь отдел снимал-надевал.
Перекуём баги на фичи!
Re[6]: Добавить константность объекту
От: Alexander Poluektov Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 09.09.11 07:52
Оценка:
Здравствуйте, Кодт, Вы писали:

AP>>Это все семечки.

AP>>Я бывает, наоборот -- константность с указателя на ссылку снимаю, так всем отделом потом обратно надевают!

К>Достаточно просто сделать указатель на ссылку, чтобы потом весь отдел снимал-надевал.


Так точно, товарищ Капитан!
Re[7]: Добавить константность объекту
От: Кодт Россия  
Дата: 09.09.11 08:02
Оценка:
Здравствуйте, Alexander Poluektov, Вы писали:

К>>Достаточно просто сделать указатель на ссылку, чтобы потом весь отдел снимал-надевал.

AP>Так точно, товарищ Капитан!

Капитанский подарок
struct foo { int* p; };
struct bar { int& r; bar(int& x) : r(x) {} };
assert(sizeof(foo)==sizeof(bar)); // доверьяй но проверьяй

int x = 1, y = 2;
bar b(x);
b.r = 3; // x = 3
((foo&)b).p = &y;
b.r = 4; // y = 4; либо компилятор оптимизировал и не ждал от нас подлости, тогда x = 4
Перекуём баги на фичи!
Re[8]: Добавить константность объекту
От: Alexander Poluektov Германия http://www.google.com/profiles/alexander.poluektov#buzz
Дата: 09.09.11 08:07
Оценка:
Здравствуйте, Кодт, Вы писали:

К>>>Достаточно просто сделать указатель на ссылку, чтобы потом весь отдел снимал-надевал.

AP>>Так точно, товарищ Капитан!

К>Капитанский подарок

К>
К>struct foo { int* p; };
К>struct bar { int& r; bar(int& x) : r(x) {} };
К>assert(sizeof(foo)==sizeof(bar)); // доверьяй но проверьяй

К>int x = 1, y = 2;
К>bar b(x);
К>b.r = 3; // x = 3
К>((foo&)b).p = &y;
К>b.r = 4; // y = 4; либо компилятор оптимизировал и не ждал от нас подлости, тогда x = 4
К>


Ну а о чем это говорит? Что сдуру можно сломать всё?
Re[9]: Добавить константность объекту
От: Кодт Россия  
Дата: 09.09.11 08:41
Оценка:
Здравствуйте, Alexander Poluektov, Вы писали:

AP>Ну а о чем это говорит? Что сдуру можно сломать всё?


А это уже пускай весь отдел чинит
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.