如何选择构造函数模板

How to select constructor template?

本文关键字:函数模板 选择 何选择      更新时间:2023-10-16

可能重复:
C++调用显式模板构造函数

首先假设我有一个带有模板化成员函数的类Data:-

class Data
{
public:
    template <class Loader> void load(const std::string& filename);
};

我可以这样使用

Data data;
data.load<SomeLoader>(filename);

一切都很好。我可以在编译器时通过模板参数选择我希望Data对象使用哪个类来加载一些数据。

然而,我不知道如何使用构造函数。。。

class Data
{
public:
    template <class Loader> Data(const std::string& filename);
};

这似乎编译得很好,但我似乎不知道如何实际调用该函数。

Data<SomeLoader> data;

这不起作用,因为这将调用类模板,而不是模板化的构造函数。

这里有我遗漏的语法吗?(如果我添加SomeLoader类型的构造函数参数,那么编译器会正确地推断出要使用的类,但这不是我在这里需要做的)

您没有丢失任何语法。明确使用构造函数模板的专业化是不可能的。

该标准在[temp.arg.explicit]/7:中对此进行了说明

由于显式模板参数列表跟随函数模板名称,并且由于con-version成员函数模板和构造函数成员函数模板是在不使用函数名称的情况下调用的,因此无法为这些函数模板提供显式模板参数列表。

这是不可能的,因为编译器无法推导类型,并且您无法将其传递给构造函数。

少数可能的解决方案:
1.使Data类成为模板
2.将一些参数传递给构造函数。这可能是使用依赖项注入并将加载程序传递给构造函数的更好解决方案。