【问题标题】:How to select constructor template? [duplicate]如何选择构造函数模板? [复制]
【发布时间】:2012-03-14 11:59:00
【问题描述】:

可能重复:
C++ invoke explicit template constructor

首先想象我有一个带有模板化成员函数的数据类:-

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 类型的构造函数参数,那么编译器会正确推断要使用的类,但这不是我需要在这里做的)

【问题讨论】:

  • 啊,我搜索了这个并没有找到任何东西。感谢您添加链接

标签: c++


【解决方案1】:

您没有遗漏任何语法。不可能显式使用构造函数模板的特化。

该标准在[temp.arg.explicit]/7 对此有说明:

因为显式模板实参列表跟在函数模板名之后,并且由于调用转换成员函数模板和构造函数成员函数模板时不使用函数名,所以无法为这些函数提供显式模板实参列表模板。

【讨论】:

  • 你能提供一些关于这方面的文件吗?
  • @Luchian 几乎没有。标准中不会有一段说“没有使用显式模板实例化调用构造函数的语法”(顺便说一下,你可以这样做,使用placement new。但我们不要去那里……)编辑哦。显然,标准确实对此提供了明确的措辞。考虑周全。查看副本。
  • @KonradRudolph:啊,就是这样,我知道我在某个地方看到过。
  • 嗯,谢谢。但这很烦人!
  • @JohnB:你总是可以将标签参数传递给构造函数,然后对其进行参数推导。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2014-04-05
    • 2011-05-24
    • 1970-01-01
    • 2016-09-12
    • 1970-01-01
    • 2013-02-22
    • 2016-03-22
    • 1970-01-01
    • 2017-09-27
    相关资源
    最近更新 更多