[英]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);
}
根據“類型”,我只需要參數的某個子集。 目前,有各種構造函數的輸入數量不同,但是將添加一些新類型,以使輸入數量相同。 我可以將類型添加到構造函數中,在其中進行很長的切換,但是params列表很長。
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語句中執行代碼,您可以在builder的構造函數中執行,也可以在要返回的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; }
Builder& typeName(Type val) { _typeName = val; return *this; }
Builder& typeName(Type val) { _typeName = val; return *this; }
(它應該返回自我引用,以便可以鏈接這些功能)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.