Поскольку я также столкнулся с этой проблемой сейчас, и я не могу добавить ответ на другой, но также действительный вопрос, заданный здесь ,
Я приведу пример решения проблемы:
получить только номер строки, где функция была вызвана в C ++ с использованием шаблонов.
Справочная информация: в C ++ можно использовать нетипичные целочисленные значения в качестве аргумента шаблона. Это отличается от типичного использования типов данных в качестве аргументов шаблона.
Поэтому идея состоит в том, чтобы использовать такие целочисленные значения для вызова функции.
#include <iostream>
class Test{
public:
template<unsigned int L>
int test(){
std::cout << "the function has been called at line number: " << L << std::endl;
return 0;
}
int test(){ return this->test<0>(); }
};
int main(int argc, char **argv){
Test t;
t.test();
t.test<__LINE__>();
return 0;
}
Выход:
функция была вызвана по номеру строки: 0
функция была вызвана по номеру строки: 16
Здесь следует упомянуть, что в C ++ 11 Standard можно задавать значения шаблона по умолчанию для функций, использующих шаблон. В pre C ++ 11 значения по умолчанию для не типовых аргументов, кажется, работают только для аргументов шаблона класса. Таким образом, в C ++ 11 не было бы необходимости иметь дублирующиеся определения функций, как указано выше. В C ++ 11 также допустимо иметь аргументы шаблона const char *, но невозможно использовать их с литералами, такими как __FILE__
или __func__
, как упоминалось здесь .
В итоге, если вы используете C ++ или C ++ 11, это может быть очень интересной альтернативой, чем использование макросов для получения вызывающей строки.