在不指定具体类型的情况下将模板传递给函数

是否可以在不指定具体类型的情况下将模板传递给函数?

我有一个基类,它是一个模板及其两个不同的专业领域。这是基类的示例:

template<typename T1,typename T2> class Dataset 
{
protected:
   std::vector<std::pair<T1,T2> > _data_buffer;
public:
   virtual void doSomething(MatrixRm& data) = 0;
}

这是扩展基类的第一类:

class InmemoryDataset : public Dataset<MatrixRm,MatrixRm>
{
public:
    void doSomething(MatrixRm& data) override
    {
     ...
    }
}

这是扩展基类的第二个类:

class OnlineDataset : public Dataset<std::string,std::string>
{
public:
    void doSomething(MatrixRm& data) override
    {
     ...
    }
}

现在,我想将任何此类传递给不同类别的函数或构造函数。但是我目前无法在不指定具体类型的情况下弄清楚该如何做。

这就是我的想象:

void someFunction(Dataset* dataset)
{
    //do something with the specialization
}

在Visual Studio中,我收到以下错误消息:

  

缺少类模板“数据集”的参数列表

在我看来,为什么不允许这样做,但是有什么解决办法吗?

xu414816349 回答:在不指定具体类型的情况下将模板传递给函数

在这种特定情况下,您可以仅将非模板基类用于您的接口:

class Dataset {
public:
   virtual void doSomething(MatrixRm& data) = 0;
};

template<typename T1,typename T2> class Dataset_impl : public Dataset
{
protected:
   std::vector<std::pair<T1,T2> > _data_buffer;
};
,

一个习惯用法是假设someFunction仅会被一个Dataset对象调用,而只是将Dataset作为模板参数,如下所示:

template<class Dataset>
void someFunction(Dataset dataset){
    // ...
}

当然,对于传递给它的每种唯一类型,someFunction的每种专业化都会产生不同的代码。

可以使用以下模板元编程样板以更安全的方式实现此习惯用法:

#include <type_traits>

template<class T>
struct is_dataset: std::false_type{};

template<class T1,class T2>
struct is_dataset<Dataset<T1,T2>>: std::true_type{};

template<class Dataset>
std::enable_if_t<is_dataset<Dataset>::value,void>
someFunction(Dataset dataset){
    // ...
}

此代码定义了元函数is_dataset,可以有效地执行编译时检查,因为传递的Dataset模板实际上是实际的Dataset对象。

您似乎已经知道,Dataset*不是实类型(甚至不是不完整的类型)。它只是为构造实类型(例如Dataset<std::string,std::string>)提供了一个接口。

,

您也可以将该函数声明为模板:

$('#example').DataTable()
本文链接:https://www.f2er.com/3164623.html

大家都在问