первый попавшйся пример из гугла компилит
правда статик ассерт не проходит в msvc
у кланга проходит
но вы умный
разберетесь https://godbolt.org/z/zEKnoefhW
Здравствуйте, Кодт, Вы писали:
К>Да ну нафиг. У меня на пет-проекты времени вообще нет, а эту либу стал делать, потому что надоело смотреть, как первокурсники сдают код с недоделками — "ой первый же assert() упал и у меня лапки". К>Гуглтест — штука тяжеловесная, на мак ставить так вообще бубен нужен, а один файлик в папку кинуть — дурак справится.
почему не doctest?
для студентов больше практической пользы будет чем от самописной либы
Здравствуйте, r0nd, Вы писали:
R>Здравствуйте, Кодт, Вы писали:
К>>Ищу способ протащить строковый литерал в тип кроссплатформенно.
R>А в каких случаях это нужно/удобно? Короче, для чего такое писать? Можно пример/сниппет?
Если надо часть работы со строками вынести в компайл-тайм. Например, http-сервер, которому надо быстро парсить входящие запросы, состоящие из текстовых заголовков — вот для них было бы удобно в компайл-тайме завести образцы, для каждого подготовить lower-case вариант, посчитать хэши и сразу упаковать их в константную таблицу поиска в компайл-тайме, чтобы максимально разгрузить рантайм, чтоб там все побыстрее работало https://github.com/vopl/adel/blob/master/include/http/headerName.hpp#L31
Здравствуйте, r0nd, Вы писали:
R>А в каких случаях это нужно/удобно? Короче, для чего такое писать? Можно пример/сниппет?
Да вот, сделал для своих и студенческих нужд маленькую библиотечку юнит-тестов из единственного хедера. https://github.com/nickolaym/simple_test
(такой гуглтест на минималках)
И меня сперва очень бесили все эти макросы EXPECT_EQ, EXPECT_LT, ...
Сделал макрос EXPECT_CMP(left, op, right)
где op — это операторы сравнения.
Подход вида
#define EXPECT_CMP(left, op, right) \
SOMEHOW_COMPARE_AND_REPORT( \
#left, left, \
#right, right, \
#op, [](const auto& a, const auto& b) { return a op b; } \
)
прост, но плох тем, что у каждого вызова EXPECT_CMP создаётся свой уникальный анонимный класс лямбды и свой уникальный экземпляр функции сравнения.
Даже если все вызовы EXPECT_CMP — над одними и теми же типами аргументов и с одними и теми же операциями.
Вместо const auto& можно написать что-то вида
[](const decltype(left)& a, const decltype(right)& b) { return a, b; }
ну, будет не полиморфная, но всё равно уникальная функция.
Поэтому захотел #op протащить в систему типов.
Набор операторов у нас конечный, нагенерить экземпляры по шаблону труда не составит
template< SomeTag > class comparator;
#define DECLARE_COMPARATOR(op) \
template<> class comparator< TAG(#op) > { \
auto operator()(const auto& a, const auto& b) { return a op b; } \
};
DECLARE_COMPARATOR(==)
DECLARE_COMPARATOR(!=)
.....
#define USE_COMPARATOR(op) comparator< TAG(#op) >{} /* (left, right) */
Здравствуйте, Кодт, Вы писали:
К>Ищу способ протащить строковый литерал в тип кроссплатформенно.
Заходил на этот вопрос не через литералы, но просто через CTAD на шаблонную обертку, инстанция которой используется как non-type template argument. Получается довольно приятно.
там бывают не то глюки нето непонятно что
когда выбор компиллеров достаточно мал
но это бывает когда открываешь уже готовый линк
когда открываешь чисто сайт с нуля, таких глюков не бывает
Здравствуйте, Sm0ke, Вы писали:
S>жаль в msvc пока так нельзя:
Это как раз то, о чём я в самом начале написал. И это — нестандартное, гнутое расширение. Шланг на него варнинги показывает.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Sm0ke, Вы писали:
S>>жаль в msvc пока так нельзя: К>Это как раз то, о чём я в самом начале написал. И это — нестандартное, гнутое расширение. Шланг на него варнинги показывает.
Если всё же нужен перегруженный литеральный суффикс оператор для текста, то это можно сделать так:
Здравствуйте, Sm0ke, Вы писали:
S>Если всё же нужен перегруженный литеральный суффикс оператор для текста, то это можно сделать так:
S>link: https://godbolt.org/z/nTvhbonrf S>проверил на ms, clang, gcc
Можно даже без танцев с index_sequence.
template <std::size_t N> struct static_text
{
char data[N];
constexpr static_text(const char (&s)[N]) {
for (std::size_t i = 0; i != N; ++i) data[i] = s[i];
}
};
Забавно, что msvc только вот такой параметр шаблона оператора принимает.
А если там будет <char...> — то это только для чисел — 123_st. Ллогика, чёрт её дери.
Здравствуйте, reversecode, Вы писали:
R>думал сейчас как открою репу R>а там под восемсот тысяч звезд R>и таких как минимум десяток звездных проектов R>открыл R>и ахнул
Да ну нафиг. У меня на пет-проекты времени вообще нет, а эту либу стал делать, потому что надоело смотреть, как первокурсники сдают код с недоделками — "ой первый же assert() упал и у меня лапки".
Гуглтест — штука тяжеловесная, на мак ставить так вообще бубен нужен, а один файлик в папку кинуть — дурак справится.
Здравствуйте, Кодт, Вы писали:
К>Потому что рано или поздно студентов на гуглтест пересадят, а практической пользы от двух несовместимых между собой самописных либ...
кто? почему?
мне гуглтест в жизни ни разу не понадобился, а с doctest-ом в пет проектах работать приходилось
Здравствуйте, night beast, Вы писали:
К>>Потому что рано или поздно студентов на гуглтест пересадят, а практической пользы от двух несовместимых между собой самописных либ...
NB>кто? почему?
Преподы, очевидно
Можно, конечно, уболтать коллег попробовать в новом семестре в одной группе.
NB>мне гуглтест в жизни ни разу не понадобился, а с doctest-ом в пет проектах работать приходилось
А мне в разном продакшене пришлось именно с гуглтестом.
Как минимум, в двух последних — Chromium и Robotic OS.