【问题标题】:enforcing same type on multiple templates [duplicate]在多个模板上强制执行相同类型[重复]
【发布时间】:2012-01-09 03:40:04
【问题描述】:

我有几个小类,它们都是彼此在同一个文件中声明和定义的对等类。很多这些类共享信息。目前,共享信息的类型是硬编码的,用于初始开发和测试目的,但我想对类进行模板化(动词形式?)。但是,如果我在每个类之前编写 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;
}

【问题讨论】:

  • 如果代码不是通用的,为什么还要模板?这种设计听起来很丑。
  • 如果模板化类是错误的,为什么要模板化它
  • @CatPlusPlus 并重新运行:允许共享数据为任何类型,只要它们都是相同的类型。我同意我的“解决方案”听起来很难看。我希望有人有更好的主意。
  • @LowTechGeek:这对我来说听起来像是一次错误的尝试。对于任何模板 X 和任何类型 T1、T2、X 和 X 都是完全不同且不相关的类型。如果它们不提供转换,那么你不能不小心混合它们,因为这将是编译错误。

标签: c++ templates


【解决方案1】:

你的要求没有意义。 foo&lt;int&gt; 是与 foo&lt;float&gt; 不同的类型 - 您不应该遇到错误类型的问题。

您似乎想要的是要求同时实例化同一个类的 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)我认为没有更好的方法可以做到这一点(这是我原来的问题)和 2)因为你、我和 @manler(编辑后)几乎得出了相同的结论,我不明白为什么似乎没有人能理解我的问题。你能否向我解释一下我原来的帖子有什么不清楚的地方,这样我以后就不会犯同样的错误了?谢谢。
【解决方案2】:

您要实现的目标在技术名称上称为概念,并且有一个 Boost 库 ConceptCheck,您可以使用它来实现它。

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

但是模板的目的是使代码通用,听起来并不像你想要的那样。我会重新考虑你的设计。

【讨论】:

    【解决方案3】:

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

    template<typename T> class A;
    
    template<>
    class A<int>
    {...};
    
    template<>
    class A<double>
    {...};
    

    那么如果你或其他人尝试创建一个

    A<std::string> a;
    

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

    但也许这不是你想要的?

    编辑:

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

    祝你好运!

    【讨论】:

      猜你喜欢
      • 2013-07-14
      • 2021-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多