如何选择构造函数模板
How to select constructor template?
可能重复:
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.将一些参数传递给构造函数。这可能是使用依赖项注入并将加载程序传递给构造函数的更好解决方案。
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 将重载的成员函数传递给函数模板
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 具有常量引用参数的函数模板专用化
- std::span<const T> 作为函数模板中的参数
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板
- 使模板函数按函数参数选择类型
- 函数模板 - 使用同一类型调用时,使用不同的参数类型选择函数
- C++ 函数解析选择模板化版本而不是普通函数
- 如何在积分类型的模板函数中选择snprinf掩码
- 显式函数模板专门化选择了错误的专门化
- 如何选择函数模板专用化
- 如何选择构造函数模板
- 使用模板选择函数的正确版本
- 模板函数如何选择参数
- 成员函数模板选择和SFINAE
- C++11:委托构造函数 - 无法选择构造函数模板?
- 没有匹配函数调用选择排序函数与模板(c++)