Pull to refresh
25
0
Александр@skor

Пользователь

Send message
Проще:

const char str1[] = "Anna";
const char str2[] = "Denis";
const char str3[] = "Vladimir";
const char str4[] = "Alexey";

union str_union
{
  char a1[sizeof(str1)],
    a2[sizeof(str2)],
    a3[sizeof(str3)],
    a4[sizeof(str4)];
};

const size_t str_max_len = sizeof(str_union);
Скажите уже кто-нибудь Qt-программистам, что «ружья кирпичом не чистят».
std-контейнер был взят для примера, случай для любых контейнеров.
Может добавить это сравнение с boost::overloaded_function в пост?
Написал свой вариант codepad.org/9qJTvTi8
Я думаю, что можно сделать проще, если использовать boost::function.
Объявляем конвертер:
typedef boost::function<ToType (boost::any)> converter;

И кладём их в мапу:
std::map<std::type_info const*, converter>;
У меня всё ещё хуже, я не смотрел ни один из перечисленных :)
Я к тому, что если автора учили, что ссылки обезопасят его, то это не правда.
Например, есть функция void print(int const& a);
Кажется, что «a» всегда будет инициализирован. Но пользователь может вызвать её так: print(*p), где int* p = NULL;
То есть, если функция принимает ссылку, это ничего не значит. Ссылки могут быть битыми.
4. Не думаю, мы же может инициализировать ссылку любым адресом, например: int& a = *(new int), в том числе и нулём.
По пунктам 2 и 4:
> 2. Нельзя сравнить адрес, содержащийся в ссылке, с адресом другого объекта или NULL.
int a = 3;
int& k = a;
assert(&a == &k);


> 4. Ссылка не может содержать нулевой адрес (поскольку проверить и обработать это невозможно).
int& a = *(int*)NULL;
assert(&a == NULL);
То есть, если мы хотим только читаемость, то переменные вполне подходят для простых случаев.
Я говорю про конкретный пример, в котором условия очень простые, что тестами их покрывать даже не нужно. Про второй пункт согласен. Если чуть сложнее или повторно используется, то, конечно, в отдельный метод.
Я взял это решение в книге Макконнелла «Совершенный код», оно там предлагалось для упрощения понимания сложных условий.
Вместо выноса в отдельные функции для первого способа я бы предпочел вынос в переменные:

$is_valid_device = $device->token != "";
$device_expired = $device->expire <= $now;

$is_locatable = $is_valid_device && $device_expired;

return $is_locatable;

Тем более отлаживать это проще и выводить в лог переменные.
если вам все равно под gcc писать, то с буста 1.50 можно не извращаться:
Lambda functions for GCC compilers even without C++11 support
У вас же GNU C, а не стандартный C++.
О, я тоже запятую пропустил =)
Ага, велосипед опять на Хабре.

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity