1

これが可能かどうかはわかりませんが、私が望むものに対する他の解決策があるかもしれません。設定ファイルから設定を取得しようとしています。文字列 (名前など)、整数、またはブール値にすることができます。もちろん、それらはファイル内にテキストとして保存されますが、設定を開いて返すためのクラスを作成しますが、文字列としてではなく、それぞれが実際に何であるかとして.

class Settings {
    public:
        Settings(string FileName);
        template <class T> T Setting(string SettingName);
}

コンストラクターはファイルをロードし、設定を解析して、たとえばマップとして保存します。ここで、Setting メンバー関数を呼び出すときに、要求された設定の値の型を特定する必要があります (数値の場合は整数、「true」または「false」の場合はブール値、英数字の場合は文字列)。その型の値を返します。例

Settings UserPreferences("Preferences.cfg");
bool AutoLogin = UserPreferences.Setting("autologin");  // return bool
string UserName = UserPreferences.Setting("username"); // return string or char*

テンプレートを見てみましたが、設定オブジェクトを作成するときに期待する変数を指定する必要があるようですが、それは重要ではありません。次のように返す変数の型を宣言することに満足しています。

bool AutoLogin = UserPreferences.Setting<bool>("autologin");
string UserName = UserPreferences.Setting<string>("username");

しかし、それが可能かどうかはわかりません。どう思いますか?

4

2 に答える 2

2

これは間違いなく可能ですが、特定の型にキャストできるという保証が必要です。これは、XNA の ContentLoader でよく見られます (システムは大きく異なりますが)。このアプローチを使用して、物事を保存して取得する方法を単純化および抽象化できます。検討:

class Loader
{
private:
    vector<void*> _items;
public:
    template <typename Type>
    Type GetItem( int index ) { return (Type)(_items[ index ]); }
};

アイデアは、内部データを要求された型に確実に (例よりも確実に) キャストできる限り、完全に合法的な操作であるということです。成功を保証する方法はまったく別の問題ですが、戻り値の型がテンプレート型のメソッドを持つことは間違いありません。次の例を考えてみましょう (リソース ローダーの大学プロジェクトとして使用しました)。

Header.h

class BasicResource
{
public:
    static const int ResourceID;
    const int ID;
    BasicResource( )
        : ID( ResourceID )
    {
    }
};

class Loader
{
private:
    vector<BasicResource*> _items;
public:
    template <typename Type>
    Type GetItem( int index );
};

#include "inline.inl"

Inline.inl

template <typename Type>
Type Loader::GetItem( int index )
{
    auto item = _items[ index ];
    if( item != nullptr && item->ID == Type::ResourceID )
    {
        return (Type)_item;
    }
    else
    {
        // Handle the fail case somehow
    }
}

インライン ファイルを使用すると、通常どおりロジックを分離できますが、テンプレート メソッドのエクスポートを可能にするヘッダーに含めることができます。

于 2013-09-23T14:02:11.510 に答える