首先想象我有一个带有模板化成员函数的类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类型的构造函数参数,那么编译器正确推断要使用的类,但这不是我需要在这里做的事情)
答案 0 :(得分:2)
您不会遗漏任何语法。显式使用构造函数模板的特化是不可能的。
该标准在[temp.arg.explicit]/7
:
因为显式模板参数列表遵循函数模板名称,并且因为不使用函数名称而调用转换成员函数模板和构造函数成员函数模板,所以无法为这些函数提供显式模板参数列表模板。
答案 1 :(得分:0)
这是不可能的,因为编译器无法推断出类型,也无法将其传递给构造函数。
几种可能的解决方案:
1.使数据类成为模板
2.将一些参数传递给构造函数。这可能是使用依赖项注入并将加载器传递给构造函数的更好解决方案。