2017-08-09 11 views
0

私はControllerクラスを継承するように設計されています。コンパイル時および実行時に使用できるC++の名前属性

class Controller { 
public: 
    virtual const std::string name() const = 0; 
} 

名前が本当にクラスプロパティではなく、インスタンスのプロパティである:それは、現在、このようなname()純粋仮想メソッドを持っています。サブクラスのインスタンス間で変更すべきではないので、実際には仮想はここでは最善のことではありません。とにかく、私は今、コンパイル時にテンプレート関数で名前が必要なところに問題を起こしました。明らかにT::name()は機能せず、サブクラスはデフォルトで構成可能ではないため、T()::name()でハックすることさえできません。

何かを変更する必要がありますが、これを行うための最善の方法を理解できません。私は、次のような状況での名前にアクセスできるようにする必要があります。

  • コンパイル時に、私は実行時には、サブクラスの種類(例えばT::name()
  • を持っているとき、私はサブクラスのインスタンスを持っている場合(たとえば、 instance->name()
  • 私は、基本クラスへ Controller*(例えばポインタを持って実行時に
  • 、)

name()がメソッドである必要はありません、それは公共の属性、または何か他のことができます。しかし、私が何を試しても、上記の3つの要件のうちの2つを満たしているように見えます。

誰もがこれを解決するための良いアプローチを提案できますか?

+2

「コンパイル時」とはどういう意味ですか?コンパイル時に文字列で実行するには、どのような文が必要ですか? –

+0

ヒント:[できません](https://stackoverflow.com/questions/27123306/is-it-possible-to-use-pos-st-st-in-a-constexpr) –

+0

テンプレート関数では、名前を取得する必要があります渡されたタイプの例えばテンプレート bool has_controller()const {... need T :: name()here}} – Kazade

答えて

1

残念ながら、あなたはこのような何かが働かないので、仮想の静的メソッドを宣言することはできません。

struct BaseClass { 
    static virtual std::string name() =0; 
}; 

struct ChildClass { 
    static std::string name() { 
    return "my_name"; 
    } 
}; 

あなたの代わりに、わずかに異なる名前を持つメソッドを行うことができます。

ます
struct BaseClass { 
    virtual std::string name() =0; 
}; 

struct ChildClass { 
    std::string name() { 
    return ChildClass::_name(); 
    }; 

    static std::string _name() { 
    return "my_name"; 
    } 
}; 

ChildClass c; 
BaseClass& b = c; 
std::cout << ChildClass::_name() << std::endl; 
std::cout << c.name() << std::endl; 
std::cout << b.name() << std::endl; 
関連する問題