#include "stdafx.h"
#include <iostream>
#include <vector>
class A
{
};
class B
{
};
class Rule
{
public:
enum ruleStatus
{
rsPassed = 1,
rsFailed = 2,
rsIncompleteData = 3
};
Rule() {}
virtual ~Rule() {}
virtual enum ruleStatus isValid(int i, int j, const int* tempval, const A& cfd) const;
virtual enum ruleStatus isValid(int i, int j, const B& pair,const int* tempval, const A& cfd) const;
protected:
};
template <typename rulePolicy> class btRuleGeneric : public Rule
{
public:
btRuleGeneric(): Rule(), _policy(*this){}
enum ruleStatus isValid(int i, int j, const int* tempval, const A& cfd) const
{
return _policy.isValid(i, j, tempval,cfd);
}
enum ruleStatus isValid(int i, int j, const B& pair, const int* tempval, const A& cfd) const
{
return _policy.isValid(i, j, pair, tempval,cfd);
}
private:
rulePolicy _policy;
};
class basePolicy
{
public:
basePolicy(const Rule& rule) : _rule(rule) {};
virtual Rule::ruleStatus isValid(int i, int j, const int* tempval, const A& cfd) const;
virtual Rule::ruleStatus isValid(int i, int j, const B& pair, const int* tempval, const A& cfd) const;
protected:
mutable std::string _lasterror;
const Rule& _rule;
};
class myPolicy : public basePolicy
{
public:
myPolicy(const Rule& rule) : basePolicy(rule) {}
Rule::ruleStatus isValid(int i, int j,
const int* tempval, const A& cfd) const;
// compiles OK if this method is uncommented
// Rule::ruleStatus isValid(int i, int j, const B& pair,
// const int* tempval, const A& cfd) const;
};
typedef std::vector<Rule*> coll;
int _tmain(int argc, _TCHAR* argv[])
{
coll lst;
Rule* rule = NULL;
lst.push_back(new btRuleGeneric<myPolicy>());
return 0;
}
#include "stdafx.h"
#include <iostream>
#include <vector>
class A
{
};
class B
{
};
class Rule
{
public:
enum ruleStatus
{
rsPassed = 1,
rsFailed = 2,
rsIncompleteData = 3
};
Rule() {}
virtual ~Rule() {}
virtual enum ruleStatus isValid(int i, int j, const int* tempval, const A& cfd) const;
virtual enum ruleStatus isValid(int i, int j, const B& pair,const int* tempval, const A& cfd) const;
protected:
};
template <typename rulePolicy> class btRuleGeneric : public Rule
{
public:
btRuleGeneric(): Rule(), _policy(*this){}
enum ruleStatus isValid(int i, int j, const int* tempval, const A& cfd) const
{
return _policy.isValid(i, j, tempval,cfd);
}
enum ruleStatus isValid(int i, int j, const B& pair, const int* tempval, const A& cfd) const
{
return _policy.isValid(i, j, pair, tempval,cfd);
}
private:
rulePolicy _policy;
};
class basePolicy
{
public:
basePolicy(const Rule& rule) : _rule(rule) {};
virtual Rule::ruleStatus isValid(int i, int j, const int* tempval, const A& cfd) const;
virtual Rule::ruleStatus isValid(int i, int j, const B& pair, const int* tempval, const A& cfd) const;
protected:
mutable std::string _lasterror;
const Rule& _rule;
};
class myPolicy : public basePolicy
{
public:
myPolicy(const Rule& rule) : basePolicy(rule) {}
Rule::ruleStatus isValid(int i, int j,
const int* tempval, const A& cfd) const;
// compiles OK if this method is uncommented
// Rule::ruleStatus isValid(int i, int j, const B& pair,
// const int* tempval, const A& cfd) const;
};
typedef std::vector<Rule*> coll;
int _tmain(int argc, _TCHAR* argv[])
{
coll lst;
Rule* rule = NULL;
lst.push_back(new btRuleGeneric<myPolicy>());
return 0;
}
To copy to clipboard, switch view to plain text mode
Bookmarks