標準的な方法は、いくつかのテンプレート黒い魔法を使うか、何らかの標準ライブラリ関数を使ってクラスの名前を得るためのものですか?typeid(T).name()の代わりにC++ 11?
答えて
私は非常に便利な関数プロトタイプのきれいな印刷見つけたら:GCCで
を、PRETTY_FUNCTIONは、型関数のシグネチャだけでなく、その裸の名前が含まれています。テンプレートクラスの例えば
か、クラス名を取得する関数がC文字列として展開:
template<typename T>
class Vector {
void foo(int i) {
cout << __PRETTY_FUNCTION__ << endl;
}
};
クラスをインスタンス化していた場合はこれがあなたに
void Vector<double>::foo(int)
のようなものを与えるだろう例えば、ダブルス。しかし、それはあなたにもユーザー定義型を与えます。
あまりファンシーではありませんが、その用途があります。
'__PRETTY_FUNCTION__'はGCCの拡張です。 –
まだ標準的な方法ではありませんが、名前は本当にかわいいです。 –
ありませんが、あなたは1を作ることができる:
template<class T> struct meta {
static const std::string& get_name() {return T::class_name;}
};
、その後、いずれかのクラスに静的メンバclass_name
を追加します。
class MyClass {
public:
static const std::string class_name("MyClass");
};
またはメタを専門:
template<> struct meta<int> {
static const std::string class_name("int");
static const std::string& get_name() {return class_name;}
};
(これを簡単にするためのマクロがあります)
#define specialize_meta(name) template<>struct meta<name>{static const std::string class_name(#name); static const std::string& get_name() {return class_name;} };
specialize_meta(double);
、その後、メタテンプレートを使用します。あなた本当には狡猾な取得したい場合
int main() {
std::cout << meta<int>::get_name();
}
を、あなたも機能のバージョンを作ることができるが、これらは(明らかに)専門なければなりません。
void foo(int) {} //function in question
template<class T, T& a> struct metafunc; //dont define generic.
template<decltype(foo), &foo> struct metafunc { //specialization
static const std::string func_name("void foo(int)");
}
すべてが 'std :: string'の代わりに' std :: string const& 'を返した場合、はるかに少ないコピーしか存在しません。 : - ]また、 'meta <> :: get_name()'は静的でなければなりません。 – ildjarn
@ildjarn: 'class_name'のインプリメンタは静的な' std :: string'メンバではなく、より複雑な文字列を完全な関数でアセンブルできるように、コピーを返すようにしました。しかし、私はユースケースを思いつくことができませんでしたので、私はあなたの提案に行ってきました。 –
これは、対象クラスでいくつかの作業が必要です。私はそんなことはできません。 –
- 1. psutil.Process(pid).nameの代わりに
- 2. C++ STLセットの代わりのC#<T>
- 3. ViewPager with Fragment Android(Func <T,T,T> Java(Android)の代わり)
- 4. C++: 'std :: is_fundamental'の代わり?
- 5. enumの代わりにC#
- 6. C++ 11のスマートポインタは常に新しい/削除の代わりに?
- 7. LikeBoxのapp-Nameの代わりに「Facebook Public Profile」
- 8. 代わりにSQLite - C#サーバー
- 9. BOOST_FOREACHを "純粋な" C++ 11の代わりに置き換えますか?
- 10. std :: Cの代わりにC
- 11. リストの代わりに<T>を読んで返す方法<T>
- 12. C++ filtのデマングルのtypeid名
- 13. Typeidの動作がC++で
- 14. のfile_get_contentsが& g t ;の代わりに、<
- 15. シルバーライトの共分散の代わりに4.0 IEnumerable <T>
- 16. C#ファイルパスのスラッシュの代わりにドット
- 17. C#のHttpListenerとGriffin.WebServerの代わりに
- 18. C++のstrcpyの代わりに
- 19. Cの__uuidofの代わりに
- 20. EmacsのCキーの代わりに?
- 21. C#Razorページのforeachの代わりに
- 22. のC#、MVC、代わりに、テーブルのHTML
- 23. wkhtmltopdf shows&B I G S T A R; (スター)の代わりに
- 24. IE 11は白いXを代わりにレンダリングする
- 25. XULの代わりにシンプルなC++ GUI?
- 26. C++()の代わりに演算子+
- 27. C++ 11 - std :: declval <T>()メソッド名
- 28. ヒロクのRails HABTMモデルは単純に "name"の代わりに "model_id"、 "name"、 "timestamp"を表示しています
- 29. Laravelコレクション、$ item ['name']の代わりに$ item-> nameのように参照する方法
- 30. TinyMCEのIDの代わりにPOSTにname属性を使用する方法
いいえ、ありません。 – Managu
それは標準的な方法です。 – spraff
@ spraffの場合、名前の表現は標準ではありません。 –