在多个模板上强制相同的类型
enforcing same type on multiple templates
我在同一个文件中声明和定义了几个彼此互为对等的小类。很多这样的类共享信息。目前,共享信息的类型是硬编码的,用于最初的开发和测试目的,但是我想模板化(动词形式?)这些类。但是,如果我在每个类之前编写template
构造,那么用户可能会使用不同的类型参数创建每个类的实例,这很可能导致数据或代码中的错误。是否有一种方法来强制所有的类实例创建相同的类型?
我能想到的唯一方法是创建一个额外的init
或spawner
类,其成员函数如createInstanceOfA()
, createInstanceOfB()
等,其中用户必须首先创建具有所需类型的spawner
类的实例,然后使用其成员函数来创建其他类的实例。当然,这意味着我的spawner
类必须与我拥有的任何实用程序类保持同步(这应该不是问题)。然而,是否有更好的方法来做到这一点呢?
EDIT:作为一个例子,我的"丑陋的解决方案"(一个简单的情况):
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;
}
你的要求没有意义。foo<int>
是不同于foo<float>
的类型-你不应该遇到错误类型的问题。
看起来你想要的是要求3个类在同一时间实例化同一个类。你想要的不是3个独立的类,而是一个单独的类:(一个例子由几个类组成)
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);
你想要实现的是被称为概念的技术名称,有一个Boost库,ConceptCheck,你可以用它来实现这个
您也可以使用std::enable_if
和SFINAE(替换失败不是错误)。
但是模板的目的是使代码泛型,这听起来并不是你真正想要的。我会重新考虑你的设计。
可以对模板进行专门化。如果你这样做了:
template<typename T> class A;
template<>
class A<int>
{...};
template<>
class A<double>
{...};
如果你或其他人试图创建一个
A<std::string> a;
会出现编译错误,因为该类型没有特化。
但也许这不是你想要的?
编辑:我多少误解了这个问题。也许您可以通过控制类的创建来解决这个问题?比如通过工厂?如果您只允许通过工厂创建类,那么您应该能够在多个模板上强制使用相同的类型。也许这只是把问题推给了工厂类…祝你好运!
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型