タイプ名T
を特定のタイプに制限するにはどうすればよいですか? 、他のデザインパターンがありますテンプレートを制限するイディオム/デザインパターンはありますか?
template <typename T>
struct Worker {
static_assert(std::is_base_of<WorkableType, T>::value, "Needs workable type");
// Do something with T
};
:
struct WorkableType {
std::string toString() { return ""; }
int get() { return 0;}
}
struct WorkabelTypeA : WorkableType {
std::string toString() { return "A"; }
int get() { return 1;}
};
//Similarly
struct WorkableTypeB : WorkableType;
をし、静的アサートとstd::is_base_of
を使用します。
template <typename T>
struct Worker {
// T can only be certain type allowing specific functionality.
// i.e T needs to be a product of some interface, support some functions, say T::toString(), T::print(), T::get().
// Do something with T
};
これは私が通常やって終わるものです:
はこれを考えてみましょうへのC++の方法を制限する不正な型付きテンプレートの誤ったインスタンス化を制限しますか?
編集:C++のコンセプトが標準になると、このように思えるようです。私が推測するまで、static_assertはおそらくenable_ifよりもきれいで冗長でしょう。
Google「C++のコンセプト」私はGCCが実用的な実装をしていると思う。 – Angew
可能な二重化http://stackoverflow.com/q/874298/612920 – Mansuro
@Angew残念ながら、それはC++ 11/14では利用できません。 – themagicalyang