__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';
}
}