종종 메타 프로그래밍에 몰두할 때만 "장황한"접근법을 권장 할 수 있지만 처음 제안하는 방식이 마음에 들지 않습니다.
정책을 사용할 때 플래그를 전달하는 것이 아니라 Policy 객체를 전달하면 사용자가 미리 정의 된 값을 사용하는 대신 원하는대로 사용자 정의 할 수 있습니다. 예를 들어
: 클래스 따라서 사용자가 선출하는 정책을 선택할 수 있도록해야
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'X , B_type , C_type , D_type , E_type >'? –
Nawaz
@Nawaz 네이밍 유형의 기술도 있습니다. –