Comments 16
> Не так давно понадобилось вычислить максимальную длину из нескольких заданных строк на этапе компиляции.
Почему бы просто вручную их не посчитать и не привлекать loki или boost?
Почему бы просто вручную их не посчитать и не привлекать loki или boost?
Можно обойтись без жутких макросов
результат
constexpr const char str1[] = "Anna";
constexpr const char str2[] = "Denis";
constexpr const char str3[] = "Vladimir";
constexpr const char str4[] = "Alexey";
constexpr size_t str_len(const char* const str)
{
return *str ? (1 + str_len(str + 1)) : 0;
}
constexpr size_t max(size_t l, size_t r)
{
return l > r? l : r;
}
template<typename T>
constexpr size_t maxLen(T t)
{
return str_len(t);
}
template <typename T, typename... Args>
constexpr size_t maxLen(T t, Args... other)
{
return max(str_len(t), maxLen(other...));
}
int main()
{
constexpr size_t x = maxLen(str1, str2, str3, str4);
return x;
}
результат
Проще:
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);
Можно даже так
const size_t str_max_len = sizeof(union {
char a1[sizeof(str1)],
a2[sizeof(str2)],
a3[sizeof(str3)],
a4[sizeof(str4)];
});
Под gcc не компилится.
Я перед отправкой специально проверил.
$ cat test.c #include <stdio.h> const char str1[] = "Anna"; const char str2[] = "Denis"; const char str3[] = "Vladimir"; const char str4[] = "Alexey"; const size_t str_max_len = sizeof(union { char a1[sizeof(str1)], a2[sizeof(str2)], a3[sizeof(str3)], a4[sizeof(str4)]; }); $ gcc --version gcc (Ubuntu 4.8.1-2ubuntu1~13.04) 4.8.1 Copyright (C) 2013 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ gcc -Wall -Wextra -c -o test.o test.c $ nm test.o 0000000000000000 R str1 0000000000000005 R str2 000000000000000b R str3 0000000000000014 R str4 0000000000000020 R str_max_len
На правах рекламы моего любимого языка D:
import std.algorithm;
enum arr = ["Anna", "Denis", "Vladimir", "Alexey"];
enum maxlen = reduce!max(map!(s => s.length)(arr));
pragma(msg, maxlen); // Вывести значение при компиляции для проверки
Все-равно строки нужно вручную собирать в какой-то массив. По-моему такие задачи лучше решать с помощью скрипта, выполняющегося в pre-build event.
Кстати, если вы создали для этого специальный макрос, то это подразумевает его повторное использование. Но если использовать ваш макрос второй раз в том же коде, это приведёт к конфликту объявляемых имён. Лучше не выносить такие вещи в макрос, а просто писать как есть.
Sign up to leave a comment.
Вычисление максимального числа в массиве на этапе компиляции