カスタム エラー クラスを作成しようとしています。そのコンストラクターは、引数を に渡すことによってエラー メッセージを作成しますfmt::format()
。FMT_STRING()
スローするたびに明示的に使用しなくても、引数に対してフォーマット文字列を常にコンパイル時にチェックすることをお勧めします。何かのようなもの:
class Err : public std::exception
{
private:
std::string m_text;
public:
template <typename S, typename... Args>
Err(const S& format, Args&&... args) {
m_text = fmt::format(FMT_STRING(format), args...);
}
virtual const char* what() const noexcept {return m_text.c_str();}
};
// ------------------------
throw Err("Error {:d}", 10); // works
throw Err("Error {:d}", "abc"); // cause Compile-time error
上記のコードでは、FMT_STRING() マクロでエラーが発生します。
error C2326: 'Err::{ctor}::<lambda_1>::()::FMT_COMPILE_STRING::operator fmt::v7::basic_string_view<char>(void) const': function cannot access 'format'
message : see reference to function template instantiation 'Err::Err<char[11],int>(const S (&),int &&)' being compiled with [ S=char [11] ]
テンプレート プログラミングの経験はほとんどありません。FMT_STRING()
毎回明示的に使用せずに、これを常にコンパイル時にフォーマット文字列をチェックさせるにはどうすればよいですか?