-2

Вопрос в заголовке. Моих знаний не хватает для ответа на этот вопрос.

  • 2
    Использовать концепт is_integral. Задали бы вопрос подробнее, с примером кода — получили бы и ответ подробнее... – Harry Jul 03 '23 at 14:09
  • Что будет делать функция - неважно, здесь главное с какими аргументами она будет работать - только с целыми любого типа на входе. Если нужно больше конкретики, то функция принимает десятичное целое число любого типа и возвращает число разрядов в аргументе. – Sergei Filler Jul 03 '23 at 14:14
  • На текущий момент такую задачу можно выполнить, прописав несколько функций (с перезагрузкой) для каждого типа. Но поскольку я новичок в программировании, могу не знать более правильного, оптимального варианта выполнения задачи. – Sergei Filler Jul 03 '23 at 14:21
  • 1
    Для начала напишите просто шаблонную функцию, принимающую в качестве аргументов любые типы, затем добавьте в нее static_assert, проверяющий, что типы целые посредством трейта ::std::is_integral – user7860670 Jul 03 '23 at 15:28
  • Булевой тип тоже будет тру, как на него проверить? – Sergei Filler Jul 03 '23 at 18:47

1 Answers1

2

Так вас устроит?

template<typename T>
requires (is_integral_v<T> && !is_same_v<bool,T>)
int digits(T d) 
{
    int r = 1;
    while(d /= 10) ++r;
    return r;
}
Harry
  • 221,325
  • <source>:4:30: error: parentheses are required around this expression in a requires clause – HolyBlackCat Jul 03 '23 at 19:34
  • @HolyBlackCat Договорились :) P.S. Просто я живу с VC++, он понимает и без скобок... :) – Harry Jul 03 '23 at 19:37
  • У меня в Эклипсе не компилится. Как только добавляю вызов функции (я назвал её width) в функции main(), так вылезает ошибка:

    Building target: siu.exe Invoking: Cygwin C++ Linker g++ -o "siu.exe" ./src/siu.o ./src/siu_main.o
    /usr/lib/gcc/x86_64-pc-cygwin/11/../../../../x86_64-pc-cygwin/bin/ld: ./src/siu_main.o:siu_main.cpp:(.text.startup+0x13): undefined reference to `int siu::width(int)' collect2: error: ld returned 1 exit status make: *** [makefile:58: siu.exe] Error 1 "make all" terminated with exit code 2. Build might be incomplete.

    – Sergei Filler Jul 03 '23 at 20:16
  • А без вызова в main() - компилится. – Sergei Filler Jul 03 '23 at 20:18
  • Вы что, вынесли шаблонную функцию в отдельный .cpp-файл??!! https://ru.stackoverflow.com/q/536546/195342 https://ru.stackoverflow.com/q/12586/195342 – Harry Jul 04 '23 at 03:17
  • Да, отдельно хедер, отдельно определение, и функция main() в отдельном файле для проверки. – Sergei Filler Jul 04 '23 at 10:50
  • Всё, заработало, большое спасибо. – Sergei Filler Jul 04 '23 at 13:58