Since variadic macros aren't standard C++98, I can't figure out how I would present an interface that is similar to what I had, without having four different versions of each assertion based on the number of parameters.
Perhaps treat the function itself as an argument to the macro (a la std::stream operators)?
void (*truth)(char const *file, int line, bool value);
void (*hope)(char const *file, int line, char const *mantra, bool imaginary = false);
void (*chastity)(char const *file, int line);
#define AssertNone(func) (func)(__FILE__, __LINE__)
#define AssertOne(func, value) (func)(__FILE__, __LINE__, value)
#define AssertExtra(func, value, extra) (func)(__FILE__, __LINE, value, extra)