Вместо этого вы можете назвать это так:
template<bool Debug = false>
constexpr int add(const int& a, const int& b, int loc = __LINE__) {
if (Debug)
std::cout << __FUNCTION__ << " called on line " << loc << '\n';
return (a + b);
}
int main() {
std::cout << add(3, 7) << '\n';
std::cout << add<true>(5, 9, __LINE__) << '\n';
return 0;
}
Вывод:
10
add called on line 14
14
Кроме того, вы можете определить макрос, чтобы пропустить третий аргумент:
#define add_Debug(a, b) add<true>(a,b,__LINE__)
C ++ 20 и выше
С C ++ 20 мы получаем std::source_location
, который содержит информацию о номере строки, функции, имени файла. Если ваш компилятор поддерживает это, вы можете использовать это. Пример (проверено с g ++ 9.3.0). Вам больше не понадобятся макросы:
#include <iostream>
#include <experimental/source_location>
using source_location = std::experimental::source_location;
template<bool Debug = false>
constexpr int add(const int& a, const int& b, source_location l = source_location::current()) {
if (Debug)
// this will print 'main' as function name
//std::cout << l.function_name() << " called on line " << l.line() << //'\n';
std::cout << source_location::current().function_name() << " called on line " << l.line() << '\n';
return (a + b);
}
int main()
{
std::cout << add(3, 7) << '\n';
std::cout << add<true>(5, 9) << '\n';
return 0;
}
Вывод:
10
add<true> called on line 16
14
С source_location
вам больше не нужно использовать макросы. Он правильно напечатает строку