将模板传递给函数而不指定具体类型
Passing template to a function without specifying concrete type
是否可以在不指定具体类型的情况下将模板传递给函数?
我有一个基类,它是一个模板,有两种不同的专业化
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中,我收到以下错误消息:
类模板的参数列表"数据集";缺少
对我来说,为什么不允许这样做是有道理的,但有什么办法吗?
您也可以将函数声明为模板:
template<class T1, class T2>
void someFunction(Dataset<T1, T2>* dataset)
{
//do something with the specialization
}
void foo() {
InMemoryDataset inMemory;
someFunction(&inMemory);
// Will call someFunction<MatrixRm, MatrixRm>(Dataset<MatrixRm, MatrixRm> *)
OnlineDataset online;
someFunction(&online);
// will call someFunction<std::string, std::string>(Dataset<std::string, std::string> *)
}
在这种特定情况下,您可以为接口使用一个非模板基类:
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>
(提供了一个接口。
相关文章:
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 将C++子类成员函数(虚拟实现)传递给 C 类型函数指针
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 使用此类型函数有什么优势
- 为什么此函数通过类型函数指针调用后,呼叫明智地行为
- 如何使用无类型函数指针调用C++成员函数
- 模板返回类型函数如何在C++中工作
- 具有通用类型函数的动态库[C ]
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 对于需要其他模板参数的类型函数的部分模板专业化
- c++错误的参数类型-函数指针
- 延迟评估模板类型函数
- 在引用或指针返回类型函数上输入
- 具有指针数据类型的非类型函数模板参数
- STL中使用的C++自定义比较类型(函数谓词与较少结构)
- C++模板基类的非类型函数模板的 using 声明
- 字符串到类型函数,模板专用化使调用统一
- 自由类型函数可以接受 Unicode 文件名吗?