例(regex.cpp) では、ライブラリの作成者がカスタム構造体 (magic_number) とこの構造体の検証関数を作成して、カスタム構造体をプログラム オプションに統合する方法を示しています。彼の例に従って、カスタム クラス (MyClass) の検証関数を作成しました。Compiler は、MyClass で lexical_cast を使用できないと文句を言います。次に、コードを実装std::istream& operator>>(std::istream& in, MyClass& d)
して削除void validate(.., MyClass*, ..)
すると、コードがコンパイルされます。operator>>
私の例では が必要ないのに、なぜこの例が を必要としないのか、誰でも説明できますvalidate
か?
編集:
#include <MyLib/MyClass.h>
std::istream& operator>>(std::istream& in, MyClass& obj) {
// some code to populate obj
return in;
}
po::variables_map parseCommandLine(int argc, char* argv[]) {
po::options_description options("Options");
options.add_options()
("help", "produce help message")
("obj", po::value<MyClass>(), "")
;
po::variables_map vm;
store(po::command_line_parser(argc, argv)
.options(options).run(), vm);
notify(vm);
return vm;
}
int main(int argc, char* argv[]) {
try {
po::variables_map vm = parseCommandLine(argc, argv);
MyClass obj = vm["my"].as<MyClass>();
cout << obj << endl;
} catch(std::exception& e) {
cout << e.what() << "\n";
return 1;
}
return 0;
}
- コードは検証なしでコンパイルされます。
また、regex.cpp に最小限の変更を加えてみました。
- マジックナンバーを削除
- 追加
#include <MyLib/MyClass.h>
- 出現するすべての magic_number を MyClass に置き換えます。
- 検証のすべてのコードをコメントアウトします。
- これはコンパイルされません。
編集:追加validate
。それらのどれもコンパイラエラーを解決しませんでした。
void validate(boost::any& v,
const std::vector<std::string>& values,
std::vector<MyClass>*, int)
{
}
void validate(boost::any& v,
const std::vector<std::string>& values,
MyClass*, long)
{
}
void validate(boost::any& v,
const std::vector<std::string>& values,
MyClass*, int)
{
}
編集:名前空間に関連している可能性があります。
検証関数を で囲んだ後namespace boost { namespace program_options { }}
、コードは op>> をオーバーロードせずにコンパイルされました。また、validate が MyClass と同じ名前空間に配置されている場合にも機能します。誰でもこれを説明できますか?