C++ 模板化类构造函数
c++ templatizing class constructor
>我有一个类,它有一个构造函数,需要相当多的参数
enum class FooType {FOO_A, FOO_B, FOO_C};
class Foo {
Foo(const double a, const double b, .... const double n);
}
根据"类型",我只需要参数的特定子集。目前有各种构造函数具有不同数量的输入,但将添加一些新类型,以便输入数量相同。我可以将类型添加到构造函数中,在其中有一个长开关,但参数列表很长。
Foo(FooType type, const double a, const double b, .... const double n) {
if (type = FooType::FOO_A) {
...
} else if ....
}
看起来还不错,但我也不喜欢有那么长的参数列表。似乎很容易使错别字难以调试。所以我可以a.)传入结构b.)做点别的
我只是对潜在的 b 解决方案感到好奇。
是否可以对此进行模板化,以便我可以创建一个模板构造函数并使用类似的东西调用构造函数
std::make_shared<Foo<FooType::FOO_A>>(a, b, c);
注意:我不想使用继承,因为类的其余功能完全没有用处/不需要它。
这可能是命名参数习语的用例:http://www.cs.technion.ac.il/users/yechiel/c++-faq/named-parameter-idiom.html .
这将允许构造函数调用如下所示:
File f = OpenFile("foo.txt")
.readonly()
.createIfNotExist()
.appendWhenWriting()
.blockSize(1024)
.unbuffered()
.exclusiveAccess();
您可以有一个包含所有命名参数的帮助程序类,而不是上面的示例,并且您的类构造函数将采用参数类的实例作为其参数。
这使您可以自由选择在构造时初始化的参数集。如果要强制为不同类型的初始化不同的子集,则应编写不同的构造函数版本。
以下是使用构建器模式创建模板化构造函数的方法:
class Foo {
double a;
int b;
double c;
public:
Foo(double a, int b, char c) {
}
};
template <FooType Type>
class Builder { };
template <>
class Builder<FooType::FOO_A> {
double _a;
public:
Builder& a(double val) { _a = val; return *this; }
Foo build() { return { _a, 0, 0 }; }
};
template <>
class Builder<FooType::FOO_B> {
int _b;
public:
Builder& b(int val) { _b = val; return *this; }
Foo build() { return { 0.0, _b, 0 }; }
};
template <>
class Builder<FooType::FOO_C> {
char _c;
public:
Builder& c(char val) { _c = val; return *this; }
Foo build() { return { 0.0, 0, _c }; }
};
Builder
类是根据需要模板化的,您在 if else 语句中执行的代码,您可以在构建器的构造函数或您将返回的Foo
实例上的 build
函数中执行。
在示例中,a
与FOO_A
相关,b
与FOO_B
相关,c
与FOO_C
相关,其他值被初始化为其默认值。
这是您将如何使用它:
int main() {
Foo testA = Builder<FooType::FOO_A>().a(12.5).build();
Foo testB = Builder<FooType::FOO_B>().b(10).build();
Foo testC = Builder<FooType::FOO_C>().c('x').build();
return 0;
}
对于构建器模式来说,这是一个非常小的示例,但从您的示例中,您似乎使用了更多的参数。向表单 Builder& typeName(Type val) { _typeName = val; return *this; }
中的任何构建器专用化添加另一个参数(它应返回自引用,以便可以链接这些功能(。
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 选择要调用的构造函数
- 如何委托派生类使用其父构造函数?
- 构造函数正在调用一个使用当前类类型的函数
- 没有用于初始化C++中的变量模板的匹配构造函数
- 初始化具有非默认构造函数的std::数组项的更好方法
- 当从函数参数中的临时值调用复制构造函数时
- 在c++构造函数中使用随机字符串生成器
- 一对向量构造函数:初始值设定项列表与显式构造
- 从构造函数抛出异常时如何克服内存泄漏
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 具有默认模板类型的默认构造函数的类型推导
- 使用dynamic_cast和构造函数时出错
- 在c++中使用向量时,如何调用构造函数和析构函数
- 奇怪的构造函数行为