在尝试应用基于策略的设计时,我陷入了困境(简化):
template <class TPrintPolicy, typename T>
struct A : private TPrintPolicy {
using TPrintPolicy::Print;
T t;
void Foo() {
Print(t);
}
};
struct IntPolicy {
void Print(int n) {
std::cout << n << std::endl;
}
};
int main(int argc, char* argv[]) {
A<IntPolicy, int> a;
a.Foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里有一个问题:我应该如何重新定义A类,以便只能为A模板提供策略参数,让它自己推断T,如下所示:
A<IntPolicy> a;
Run Code Online (Sandbox Code Playgroud)
优选地,政策定义不应该比现在复杂得多.有任何想法吗?
编辑:
我忘了提到我不希望策略导出typedef.这当然是简单的解决方案,但不能自己推断T的类型?
在每个策略中创建一个typedef,用于提供策略的数据类型.
template <class TPrintPolicy>
struct A : private TPrintPolicy {
using TPrintPolicy::Print;
typename TPrintPolicy::data_type t;
void Foo() {
Print(t);
}
};
struct IntPolicy {
typedef int data_type;
void Print(int n) {
std::cout << n << std::endl;
}
};
int main(int argc, char* argv[]) {
A<IntPolicy> a;
a.Foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编辑:就个人而言,我可能会使用typedef,即使它增加了一些重复,因为我相信它使代码更清晰.但是,如果你真的想避免它,你可以尝试类似的东西.
#include <boost/typeof/typeof.hpp>
template<typename T, typename Class>
T DeduceArgumentType(void (Class::*ptr)(T)) {}
template <class TPrintPolicy>
struct A : private TPrintPolicy {
using TPrintPolicy::Print;
typedef BOOST_TYPEOF(DeduceArgumentType(&TPrintPolicy::Print)) data_type;
data_type t;
void Foo() {
Print(t);
}
};
struct IntPolicy {
void Print(int n) {
std::cout << n << std::endl;
}
};
int main(int argc, char* argv[]) {
A<IntPolicy> a;
a.Foo();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
也许有可能让Boost.TypeTraits这样做,但我不知道如何做.