【发布时间】:2014-07-23 16:46:23
【问题描述】:
有人如何编译这段代码:
#include <iostream>
using namespace std;
enum E { A, B};
template< E x>
class C {
public:
#if( x == A)
static void foo() {
cout << "A";
}
#elif( x == B)
static void goo() {
cout << "B";
}
#endif
};
int main() {
C< A>::foo();
C< B>::goo();
return 0;
}
error: ‘goo’ is not a member of ‘C<(E)1u>’
我有两个大类,只有几行不同,所以我想制作枚举模板。问题是这行有using 关键字,所以我不知道该放什么。
有什么正确的方法吗?
PS> 我必须使用 C++03。
编辑:稍微澄清一下。我知道template<> 构造,但我不想使用它,因为这样我得到了很多代码重复。也许我可以以某种方式进行部分“模板实例化”(如果这是template<> 的正确术语)?
假设我有两个班级(我不会有更多):
class A {
public:
//…a lot of code…
//few lines that differs in A and B
}
class B {
//…the same mass of code…
//few lines that differs in A and B
}
所以我决定在enum上制作模板:
enum E { A, B}
template< E>
class C{
//…common code…
}
现在我不知道如何处理这在 A 和 B 中不同的几行。我知道常见的方法是进行模板实例化,但是我会得到与 A 和 B 类完全相同的内容。
从 OOP 的角度来看,我应该对 A 和 B 使用常见的 Base。但问题是A 和B 已经是一样的了。它们仅与以下行不同:
using CanStoreKeyValue< QString, Request>::set;
using CanStoreKeyValue< QString, Response>::set;
其中Response 和Request 是类型定义。此外,在我的代码中,A 和 B 是同一个模板抽象类的子类。当然,他们使用不同的模板参数继承它。这以某种方式破坏了模板枚举的使用——编译器只是看不到某些虚拟方法不再是纯的。所以……这就是为什么我要问我在问什么。我认为预处理器可以通过#if-directives 与模板引擎进行交互(最后,它们都是编译时进程)。
【问题讨论】:
-
预处理发生在其他任何事情之前。预处理器指令(以
#开头)不知道A、B和x甚至存在。 -
我不明白你在做什么。为什么不创建两个类,一个是 foo,一个是 goo?
-
如果方法与参数不兼容,您是否尝试获得编译时错误,或者您是否尝试进行某种编译时调度?
-
您的预处理器指令(任何以 # 开头的指令)在编译器看到之前就删除了
goo()的定义。 -
@ValentinT。为什么不将请求/响应类型作为模板参数而不是 A、B?
标签: c++ templates if-statement enums c++03