使用模板来准确克隆类类型?

时间:2013-09-23 03:46:25

标签: c++ templates

我有一系列C ++类,我希望它们在功能上都相同,但在继承方面则无关。实际上,这些类只会在名称上有所不同。 (这些类将被抛出,我不希望某个基类的catch子句吞噬抛出的派生对象。成为派生类,但我希望创建离散的抛出类集就捕获块而言,总是被隔离。)

当然,这样做的缺点是重复源代码。我不想在需要更改某些内容时更新相同代码的N个副本。

我已经通过#define解决了代码重复问题。但我认为如果我可以利用模板,它将有助于调试能力。模板中唯一参数化的是类名本身。

我尝试了以下方法,它在gcc中无效(启用了c ++ 0x支持):

template<typename ClassName>
class ClassName
{
  public:
    ClassName(int foo, float bar) { ... }
   ~ClassName() { ... }

   bool SomePublicMethod() { ... }

  private:
    ...
}

然后我会用类似于:

的东西声明实际的类
typedef ClassName<UnrelatedClass1> UnrelatedClass1;
typedef ClassName<UnrelatedClass2> UnrelatedClass2;

我已经知道以上不起作用;我提供它作为我想要完成的概念示例,并且想知道是否有办法让它工作,除了我目前正在使用的#define宏方法(它的调试能力降低了)。 )

3 个答案:

答案 0 :(得分:3)

使用值专用模板:

template<int ID>
class ClassName
{
  public:
    ClassName(int foo, float bar) { ... }
   ~ClassName() { ... }

   bool SomePublicMethod() { ... }

  private:
    ...
}

typedef ClassName<1> UnrelatedClass1;
typedef ClassName<2> UnrelatedClass2;

答案 1 :(得分:0)

这听起来不是一个好主意。

异常类应该捕获特定类型的错误,继承用于更加一般化错误类型。

例如,你可能有一个'磁盘崩溃异常',更常见的可能是'磁盘异常',更普遍的是'io exception',并且其核心始终是'std :: exception'

如果所有异常都捕获了不同类型/类别的错误,那么为什么它们都具有相同类型的实现。

在模板中看到#define混合的情况并不常见,因为当编译器出错时,它总是会降低可读性(即使它在没有导致错误的情况下看起来更具可读性)。

也许您可以提供有关异常类中实现内容的更多信息,我可以看看是否可以为您提供进一步的帮助。

答案 2 :(得分:0)

当他们说你应该使用继承时,我同意其他人的看法。它有很多用途(其中一个就是你想要有类似课程的原因)。仅当对象相关时才编写派生类不是必须的 - 即使只是匹配的功能也很好,因为你的想法实际上是将类似的代码放在一起。

但是,由于您的查询是关于创建多个类而我们没有足够的项目视图,我相信您可能真的需要单独的类。一种方法是通过宏。这是一个示例:

#include <iostream>
using  std::cout;
using  std::endl;

#define CUSTOM_CLASS(_CL) class _CL\
{\
      public:\
                  _CL(int foo, float bar) { cout << "Creating instance with foo=" << foo << ";bar=" << bar << endl;}\
       ~_CL() { }\
       bool SomePublicMethod() { cout << "Class created\n"; }\
};

CUSTOM_CLASS(myclass1);
CUSTOM_CLASS(myclass2);

int main()
{
    myclass1 instance1(1, 1.3f);
    myclass2 instance2(2, 0.3f);
    return 0;
}

如果使用g ++运行它,您将得到以下结果:

Creating instance with foo=1;bar=1.3
Creating instance with foo=2;bar=0.3