簡體   English   中英

實例化 C++ 模板 class 不帶參數/取決於 if 語句中的類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM