在 C++ 中使用具有相同类的多个模板

Posted

技术标签:

【中文标题】在 C++ 中使用具有相同类的多个模板【英文标题】:Using multiple templates with the same class in C++ 【发布时间】:2019-12-01 06:48:05 【问题描述】:

我在 C++ 中有以下代码 -

template <class T>

class TempClass  

    T value;

public: 
    TempClass(T item) 
     
        value = item; 
     

    T getValue() 
     
        return value; 
     
; 

int main() 
 
    TempClass<string>* String =  
      new TempClass<string>("Rin>Sakura");


    cout << "Output Values: " << String->getValue()  
         << "\n"; 

    class TempClass<int>* integer = new TempClass<int>(9); 
    cout << "Output Values: " << integer->getValue(); 
 

我想做的是使用多个模板和上面的类 TempClass。我知道这样做的一种方法是使用

template <class T1, class T2>

,但如果我这样做,那么类的所有实例都必须有 2 个模板参数。我想做的更像是:

if (flag)
    //initialize an instance of TempClass with one template

    TempClass<string> s("haha");

else
    //initialize an instance of TempClass with 2 templates.

    TempClass<string, int> s("haha", 5);

有没有办法在不使用另一个新类的情况下做到这一点?

【问题讨论】:

【参考方案1】:

您可以使用可变参数模板和std::tuple 来保存不同类型的值。最小的例子:

template<class... Ts>
class TempClass 
    using Tuple = std::tuple<Ts...>;
    Tuple values;

public: 
    TempClass(Ts... items) : valuesitems...  

    template<std::size_t index>
    std::tuple_element_t<index, Tuple> getValue() const 
        return std::get<index>(values);
     
; 

int main() 
    TempClass<int, std::string, double> tc10, "string", 20.19;
    std::cout << tc1.getValue<2>(); // Output: 20.19

std::tuple_element_t 仅从 C++14 开始可用。在 C+11 中,您应该更详细:typename std::tuple_element&lt;index, Tuple&gt;::type

【讨论】:

是的,您的答案似乎正是我想要的。但是,在this 编译器上运行时,我收到 error: 'tuple_element_t' in namespace'std' does not name a template type 错误。据我所知,这可能是编译器的问题。 @RijulGanguly,试试typename std::tuple_element&lt;index, Tuple&gt;::type

以上是关于在 C++ 中使用具有相同类的多个模板的主要内容,如果未能解决你的问题,请参考以下文章

C++ 多个具有相同名称的类

具有相同类的多个 IWebElements 都指向第一个

如何在 C++ 中运行具有仅调用线程的函数的类的多个对象?

AngularJS 具有相同模板的多个路由不应重新渲染

C++模板类和类模板

具有来自多个类的值的 C++ std::vector