2

一般的な構成ファイル パーサーを実装しようとしていますが、入力パラメーターの型に基づいて戻り値の型を決定できるメソッドをクラスに記述する方法を知りたいと思っています。これが私が意味することです:

class Config
{
    ...
    template <typename T>
    T GetData (const std::string &key, const T &defaultValue) const;
    ...
}

上記のメソッドを呼び出すには、次のようなものを使用する必要があります。

some_type data = Config::GetData<some_type>("some_key", defaultValue);

冗長な仕様を取り除くにはどうすればよいですか? boost::property_tree::ptree::get() がこのトリックを実行できることがわかりましたが、実装はかなり複雑で、この複雑な宣言を解読できませんでした:

template<class Type, class Translator>
typename boost::enable_if<detail::is_translator<Translator>, Type>::type
get(const path_type &path, Translator tr) const;

可能であれば、Config クラスを使用するコードでブーストへの依存関係を作成せずに、これを実行したいと考えています。

PS: C++ テンプレートに関しては、私は無知です :(

4

1 に答える 1

5

enable_ifあなたが示したコードのは、無関係なことをします。あなたの場合、明示的なテンプレート仕様を削除するだけで、コンパイラはパラメータからそれを推測します:

some_type data = Config::GetData("some_key", defaultValue);

さらに良いことに、C++11 では、宣言時に変数の型を指定する必要さえありません。同様に推論することもできます。

auto data = Config::GetData("some_key", defaultValue);

…ただし、C++ は、戻り値の型ではなく、パラメーターからテンプレート引数のみを推測できることに注意してください。つまり、以下は機能しませ

class Config {
    …
    template <typename T>
    static T GetData(const std::string &key) const;
    …
}
some_type data = Config::GetData("some_key");

ここでは、テンプレート引数を明示的にするか、実際のオブジェクトではなくプロキシ クラスを返すトリックを使用して、暗黙的な変換演算子を定義する必要があります。面倒で、ほとんどの場合不要です。

于 2012-06-18T09:46:26.843 に答える