__FILE__
заменяется строковым литералом, тип которого
const char[length_of_particular_string]
Вы действительно должны пересмотреть то, что вы делаете. (Мнение также основано на вашем предыдущем вопросе.)
Во-первых, boost::any для такого использования не годится (в частности, потому что тип строкового литерала в разных случаях будет разным). Но даже если бы не технические трудности, вам следует использовать обычную перегрузку функций.
Что еще более важно, кажется, что функциональность, которую вы хотите, состоит в том, чтобы получить логическое значение и выдать ошибку, содержащую имя файла и номер строки, если значение неверно. Поскольку вам всегда требуются все 3 компонента (хотя, согласно вашему описанию, было бы возможно, чтобы он выбрасывал, не указывая ему имя файла, или чтобы класс не делал ничего полезного), функция, которая принимает эти 3 аргумента, имеет больше смысла.
Кроме того, теперь вы можете обернуть вызовы этого макроса, чтобы имя файла и номер строки предоставлялись автоматически.
Полный пример:
#include <stdexcept>
#include <sstream>
#include <iostream>
void check_result(bool result, const char* line, int line_number)
{
if (!result) {
//for example:
std::stringstream ss;
ss << line << ' ' << line_number;
throw std::runtime_error(ss.str());
}
}
#define CALL_AND_CHECK(expression) check_result((expression), __FILE__, __LINE__)
bool foobar(bool b) { return b; }
int main()
{
try {
CALL_AND_CHECK(foobar(true));
CALL_AND_CHECK(foobar(false));
} catch (const std::exception& e) {
std::cout << e.what() << '\n';
}
}
person
visitor
schedule
21.02.2011