[英]Instantiate C++ template class without parameter / depending on type in if-statement
I wrote different function objects A, B, and C in C++ and I want to instantiate a template class with one of the function objects, depending on the user input. 但似乎沒有辦法只實例化 if 語句中的一種類型,是嗎?
如果我嘗試在 if 語句中使用模板實例化一個 class,g++ 編譯器會給我一個“使用未聲明的標識符 'bkt'”的錯誤。 如果我事先實例化它,class 在離開 if 語句時會自行破壞。
這是我的代碼:
class A {
public: void operator()(int a) {}
};
class B {
public: void operator()(int a) {}
};
class C {
public: void operator()(int a) {}
};
template <typename T>
class MyClass {
public:
MyClass<T>(const std::string &file);
~MyClass<T>;
private:
T m_func;
int doStuff(int a) {
return m_func(a);
}
};
int main() {
std::string filename = std::string(argv[1]);
std::getline(std::cin, metric);
if (metric == "A") {
MyClass<A> foo(filename);
}
else if (metric == "B") {
MyClass<B> foo(filename);
}
else {
MyClass<C> foo(filename);
}
int a = 1;
foo.doStuff(int a); // undeclared identifier "foo"
getchar();
return 0;
}
我知道,我必須以某種方式聲明 foo 變量,但我希望編譯器可以接受它,因為 if 語句的一種情況無論如何都會發生。 顯然不是,那么我該怎么做才能不實例化每種類型?
簡單來說:模板可以幫助您實現編譯時多態性,但您想要的是運行時多態性。 但是,將它們混合起來很簡單。
首先創建一個基礎 class:
struct MyBase {
~MyBase(){}
virtual int doStuff(int a) = 0;
};
然后讓模板化的 class 繼承它:
template <typename T>
class MyClass : MyBase {
public:
MyClass<T>(const std::string &file);
~MyClass<T>;
private:
T m_func;
int doStuff(int a) override {
return m_func(a);
}
};
現在您可以有一個指向MyBase
的指針,並在 if-cases 中分配具體類型。 我希望你明白這個想法,並且只會給出一個粗略的草圖:
std::shared_ptr<MyBase> foo; // or perhaps a unique_ptr
if (metric == "A") {
foo = ... create MyClass<A>
} else if (metric == "B") {
...
}
foo->doStuff(3);
為了完整起見...您的代碼不起作用,因為在
if (metric == "A") {
MyClass<A> foo(filename);
}
foo
的生命周期僅限於以}
結尾的if
情況的 scope 並且您無法在外部訪問它。
PS :由於所有指標都具有相同的簽名,我會使用不需要MyClass
作為模板的不同方法。 無論如何,作為模板的MyClass
似乎是一個要求。
PPS :也許這只是措辭問題,但是...
那么我該怎么做才能不實例化每種類型?
你對此無能為力。 模板在編譯時被實例化。 如果您想在運行時選擇一個實例化,您需要將它們實例化。 在上面的代碼中(一旦你填補了漏洞),每個可能的指標都會有一個實例化,但它只創建一個實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.