Search
Write a publication
Pull to refresh

Comments 16

> Не так давно понадобилось вычислить максимальную длину из нескольких заданных строк на этапе компиляции.

Почему бы просто вручную их не посчитать и не привлекать 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)];
});
Я перед отправкой специально проверил.

$ 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
Так у вас же Си, а не Си++ =)
Ах, действительно, в c++ не работает )
На правах рекламы моего любимого языка 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.

Articles