多くの場合、メタプログラミングでおしゃべりをしていますが、「冗長」なアプローチしか勧められませんが、私が提案する最初のアプローチはあまり好きではありません。
ポリシーを使用する場合は、フラグを渡すだけでなく、独自の定義済み値に頼るのではなく、ポリシーオブジェクトを渡すことができます。例えば
:
struct NodeCheckerTag {};
struct CheckEveryNode {
typedef NodeCheckerTag PolicyTag;
void check(List const& list);
};
struct CheckFirstNode {
typedef NodeCheckerTag PolicyTag;
void check(List const& list);
};
template <typename Rand>
struct CheckSomeNodes {
typedef NodeCheckerTag PolicyTag;
CheckSomeNodes(Rand rand): _rand(rand) {}
void check(List const& list);
Rand _rand;
};
あなたのクラスは、このように、ユーザが選出するためにどのポリシーを選択できるようにする必要があります。
template <typename NodeChecker>
class X: NodeChecker // allow stateful implementation but let EBO kick in
{
};
PolicyTag
は、複数のポリシーが存在するためである。
template <typename NodeChecker, typename NodeAllocator, typename NodeNotifier>
class X;
通常、わかりやすいデフォルトを設定する必要がありますが、常にその場合があります私はちょうど最後のカスタマイズしたい!あなたが唯一のいくつかの関数を呼び出すことを心配している場合、ポリシーから継承することで、選択は不要かもしれないと
template <typename Tag, typename Default, typename... Policies>
struct PolicySelector
{
typedef /**/ type;
};
template <typename... Policies>
class X: Policies...
{
typedef typename PolicySelector<NodeCheckerTag, CheckNoNode,
Policies...>::type NodeCheckerPolicy;
typedef typename PolicySelector<NodeAllocatorTag, StdAllocator,
Policies...>::type NodeAllocatorPolicy;
...
};
注:は、可変長テンプレートに切り替えることにより、あなたはそれを得ることができます。派生クラス(ここではX)に明示的にtypedefする必要があるので、ポリシーに隠された内部typedefが必要な場合にのみ必要です。
@Nawazは複数の「ポリシー」があり、最初に選択した場合はXとなることを覚えておいてください。より精巧だが非常に読みやすい。そして、古い格言は「コンピュータ・プログラムは数回だけコンピュータで読まれるが、数千ではないにしても何百人も読んでいる」と述べている。 –
@何も私たちができることはありません:あなたはもっとわかりやすいものを教えてください: 'X' OR 'X 、B_type 、C_type 、D_type 、E_type > '? –
Nawaz
@Nawazネーミングタイプの技術もあります。 –