【发布时间】:2012-10-25 18:04:15
【问题描述】:
我有 3 个课程,如下所示:
template <typename RET, typename ARG1 = int, [...], typename ARG5 = int>
class FunctionPointer {
virtual operator()(ARG1, [...], ARG5);
};
template <typename RET, class TYPE, typename ARG1 = int, [...], typename ARG5 = int>
class ClassFunctionPointer : public FunctionPointer<RET, ARG1, [...], ARG5> {
// make it so that class functions fit here
};
template <typename RET, typename ARG1 = int, [...], typename ARG5 = int>
class GlobalFunctionPointer : public FunctionPointer<RET, ARG1, [...], ARG5> {
// make it so that non-member functions fit here
};
它们都是重载的,因此每个类都可以使用可变数量的参数进行实例化,这意味着以下所有示例都是有效的:
GlobalFunctionPointer<void> a(&test1);
GlobalFunctionPointer<void, int> b(&test2);
ClassFunctionPointer<void, TestClass, int, char> c(testObject, &TestClass::test1);
ClassFunctionPointer<void, TestClass, int, char, std::string, float, SomeClass> d(testObject, &TestClass::test2);
但是对于这一切,我写了很多代码,大约 500 行,见here。 我发现这很难看,所以我正在寻找一个更优雅的解决方案。 有吗?
(顺便说一句,所有纠结的代码都是为了成为更复杂的事件系统的基础。)
【问题讨论】:
-
你并不孤单。 VS11 没有可变参数模板,因此它们必须通过一些非常丑陋的宏才能在大多数情况下实现大致相同的行为。
-
对不起,我无法抗拒。如果你愿意,你可以打败我。但是删除空行呢?会将您的代码从 500 减少到 250!
-
@pbhd:哈哈,我可以这样做,但我发现我的代码中包含这 2000 个空行,可读性更高。
标签: c++ class templates overloading