我有几个小类,它们是在同一个文件中声明和定义的彼此的所有对等体。很多这些类共享信息。目前,共享信息的类型是硬编码的,用于初始开发和测试目的,但我想模拟(动词形式?)类。但是,如果我在每个类之前编写template
构造,则会产生用户可以使用不同类型参数创建每个类的实例的可能性,这很可能导致数据或代码中的错误。有没有办法强制使用相同的类型创建所有类实例?
我能想到这样做的唯一方法是创建一个额外的init
或spawner
类,其成员函数包括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;
}
答案 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;
会出现编译错误,因为该类型不是专门的。
但也许这不是你想要的?
编辑:
我有点误解了这个问题。也许你可以通过控制类的创建来解决这个问题?喜欢通过工厂?如果您只允许通过工厂创建类,那么您应该能够在多个模板上强制执行相同的类型。也许这只是将问题推向工厂阶级......
祝你好运!