在多个模板上强制执行相同的类型

时间:2011-11-29 19:54:49

标签: c++ templates

我有几个小类,它们是在同一个文件中声明和定义的彼此的所有对等体。很多这些类共享信息。目前,共享信息的类型是硬编码的,用于初始开发和测试目的,但我想模拟(动词形式?)类。但是,如果我在每个类之前编写template构造,则会产生用户可以使用不同类型参数创建每个类的实例的可能性,这很可能导致数据或代码中的错误。有没有办法强制使用相同的类型创建所有类实例?

我能想到这样做的唯一方法是创建一个额外的initspawner类,其成员函数包括createInstanceOfA()createInstanceOfB()等,其中用户必须首先创建具有所需类型的spawner类的实例,然后使用其成员函数创建其他类的实例。当然,这意味着我的spawner类必须与我拥有的任何实用程序类保持同步(这应该不是问题)。但是,有没有更好的方法呢?

编辑:举个例子,我的“丑陋的解决方案”(一个简单的案例):

template <typename T>
struct A {
  void manipulate( T arg );
};

template <typename T>
struct B {
  void manipulate( T arg );
};

template <typename T>
struct C {
  void manipulate( T arg );
};

template <typename T>
struct Spawner {
  A<T> createInstanceOfA( void );
  B<T> createInstanceOfB( void );
  C<T> createInstanceOfC( void );
};


int main() {

  // don't allow
  A<int> a;
  B<float> b;
  C<double> c;

  // allow
  Spawner<int> s;
  A<int> s.createInstanceOfA();  // not sure if syntax is correct
  B<int> s.createInstanceOfB();
  C<int> s.createInstanceOfC();

  return 0;
}

3 个答案:

答案 0 :(得分:2)

你要求的东西没有意义。 foo<int>foo<float>的类型不同 - 您不应该遇到错误类型的问题。

你想要的是要求3个类同时实例化同一个类。你想要的不是3个单独的类,而是1个单独的类:(例子由几个构建为一个的类组成)

template <typename T>
struct col {
  struct t1 {
    T data;
  } a;
  struct t2 {
    T data;
  } b;
};

col<int> foo;
foo.a.data = 5;
foo.b.data = 7;

void process_stuff(col<int>::t1 a) {
  // ...
}
process_stuff(foo.a);

答案 1 :(得分:1)

您要实现的目标是通过技术名称称为概念,并且可以使用Boost库ConceptCheck来实现此功能。

您也可以使用std::enable_if和SFINAE(替换失败不是错误)。

但是模板意味着使代码变得通用,并且它听起来并不像你想要的那样。我会重新考虑你的设计。

答案 2 :(得分:1)

您可以专门化模板。 所以如果你这样做:

template<typename T> class A;

template<>
class A<int>
{...};

template<>
class A<double>
{...};

然后,如果您或其他人试图创建

A<std::string> a;

会出现编译错误,因为该类型不是专门的。

但也许这不是你想要的?

编辑:

我有点误解了这个问题。也许你可以通过控制类的创建来解决这个问题?喜欢通过工厂?如果您只允许通过工厂创建类,那么您应该能够在多个模板上强制执行相同的类型。也许这只是将问题推向工厂阶级......

祝你好运!