1

次のような GTK GUI の単純なラッパー クラスがあります。

template <class T>
class LabeledEntry
{
    string name;
    T var;

    Gtk::HBox hbox;
    Gtk::Label label;
    Gtk::Entry entry;

    public:
    LabeledEntry( string _name, T _var, Gtk::VBox* vbox):
        name( _name ),
        var(_var)
    {
        label.set_text( name.c_str() );
        ostringstream os;
        os << var ;

        entry.set_text( os.str().c_str() );
        hbox.add( label );
        hbox.add( entry );

        vbox->add( hbox);
    }

    T Get()
    {
        string valString( entry.get_text());
        istringstream is( valString);
        is >> noskipws >> var;

        return var;
    }
};

文字列の空白をスキップすることが機能しないためT Get()、 if のタイプがTisの場合に特別な実装が必要です。stringしたがって、ここでgetlineメソッドが必要です。

std::is__xxxなどの多くのプロパティに対してチェックするテンプレートがたくさん見つかりましたis_integral。しかし、特定のタイプと直接比較する必要があります。チャンスはありますか?

そして、クラス内に両方の実装を記述する構文はどうですか? 何かのようなもの:

class ...
{ 
    std::enable_if( true, XXX_IS_STRING)::type Get()
    {
    }

    std::enable_if ( false, XXX_IS_SRING)::type Get()
    {
    }
};

申し訳ありませんが、メンバ パラメータ リストにテンプレート パラメータを指定せずに SFINAE を使用するのは少し混乱しています。

4

4 に答える 4

4

メンバー関数のみがクラス テンプレートの型に基づく特別な実装を必要とする場合、SFINAE を使用するよりも、メンバー関数の特殊化を単純に定義する方が簡単な場合があります。

#include <iostream>
#include <string>

template <class T>
class LabeledEntry
{
  // ...
public:
  T Get()
  {
    return 42;
  }
};

template <>
std::string LabeledEntry<std::string>::Get()
{
  return "string";
}

int main()
{
  std::cout << LabeledEntry<std::string>().Get() << "\n"
            << LabeledEntry<int>().Get() << std::endl;
}

次の出力が得られます。

string
42
于 2013-09-09T14:48:28.287 に答える