2011-04-11 2 views
0

옵션이있는 경우 어떤 것을 선택 하시겠습니까?프로그래밍 템플리트 스타일

//taking first approach 
//somewhere in the code 
X<CheckEveryNode<false>> x; 

두 번째 측면에 입력 할 누군가가 선호하는 훨씬 더가되어 한쪽에, 디자이너의 관점에서 정말 명확하지 않다

template<class CheckEveryNode<true>> 
struct X; 

or 

template<bool CheckEveryNode> 
struct X; 

우리는 실제 코드의 가독성을 :

//taking second approach 
//somewhere in the code 
X<false> x;//but here we don't really see immediately what the false means. 

따라서, 귀하의 의견/제안

답변

0

전나무 기대 접근법이 번거롭다. 첫 번째 것에 대한 설득력있는 근거가없는 상황에서 두 번째 것에 갈 것입니다. 가독성은 두 번째 가독성입니다. 실제로 첫 번째 구문은 핫키 구문으로 인해 가독성이 떨어집니다.

+0

@Nawaz는 하나 이상의 "정책"이있을 것이라는 점을 명심하십시오. 그러면 첫 번째 것을 선택하면 X 가 표시됩니다. 더 정교하지만 매우 읽을 수 있습니다. 그리고 오래된 격언은 "컴퓨터 프로그램은 컴퓨터에 의해 단지 몇 번 읽히지 만, 사람들이 수천이 아니라도 수백 번 읽힌다"고 말한다. –

+0

@ 우리가 할 수있는 일은 아무것도 없다. 그래서 무엇이 더 읽기 쉽다고 말 하느냐?'X 'X , B_type , C_type , D_type , E_type >'? – Nawaz

+0

@Nawaz 네이밍 유형의 기술도 있습니다. –

0

나는 두 번째 것을 좋아한다. 내 철학은 왜 필요없는 경우 추가 유형을 만드는 것입니까?

1

먼저

template<class CheckEveryNode<true>> 
struct X; 

잘못 될 것인가, 그것은해야 당신도 참 또는 거짓 조건 중 하나에 전문화 할 필요가

template<template<bool> CheckEveryNode> 
struct X{}; 

:

// above is true case, below is false case 
template<> 
struct X<CheckEveryNode<false> >{}; 

또는 부분 사용 전문 분야는 다음과 같습니다.

template<class CheckEveryNode> 
struct X; 

template<bool B> 
struct X<CheckEveryNode<B> >{ 
    // real implementation 
}; 

"예상대로"두 번째 구현 방법은 구현하기 쉽고 읽기 쉽습니다. 템플리트 인수를 제공 할 때 추가 인수가 필요하지 않은 이유를 알 수 있습니다.

2

종종 메타 프로그래밍에 몰두할 때만 "장황한"접근법을 권장 할 수 있지만 처음 제안하는 방식이 마음에 들지 않습니다.

정책을 사용할 때 플래그를 전달하는 것이 아니라 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가 정책에 숨겨져 있어야하는 경우에만 필요합니다.

+0

@Natthieu (정교한 예)에 감사드립니다. 내가 여기서 묻는 유일한 방법은 작성하는 것이 번거롭지 만 정책에 따라 "기본 제공"방식을 사용하는 방법입니다. 다른 건 없어. 그러나 (정교한) 당신의 대답에 감사드립니다. –

1

정책이 여러 개이고 다양한 부울 값의 의미를 모르는 경우 문제가 발생하면 불린을 모두 제거하고 태그를 사용할 수 있습니다.

struct CheckEvery { }; 
struct CheckNone { }; 

template<typename Check> struct Thingy; 
template<> Thingy<CheckEvery> { ... }; 
template<> Thingy<CheckNone> { ... }; 

또는 정책을 전문화하기보다는 수행 할 작업을 지시하도록 할 수 있습니다.

struct CheckEvery { bool shouldCheck(int) { return true; } }; 
struct CheckNone { bool shouldCheck(int) { return false; } }; 
struct CheckOdds { bool shouldCheck(int i) { return i % 2; } }; 

template<typename Checker> struct Thingy { 
    Checker checker; 
    void someFunction(int i) { if(checker.shouldCheck(i)) check(i); } 
}; 

예제는 잘 정리되어 있지 않지만 아이디어가 있습니다. 예를 들어, Checker 객체를 Thingy 생성자에 제공하고 싶을 수도 있습니다.

+0

답장을 보내 주셔서 감사합니다.하지만 "예제"와 같은 부울 값이있는 예제를 게시했습니다. 여기서 사용자들이 정책을 "누드"유형과 비교하여 어떻게 인식하는지에 대해 관심이 있습니다. –

+0

제안을 요청했는데, 이것들은 제 것이 었습니다. –

관련 문제