为什么不能为构造函数模板指定模板参数

时间:2021-07-17 01:15:57

标签: c++ templates constructor template-argument-deduction

不久前,我想编写一个类,该类可以返回指向某个类型的指针,该类始终使用相同的参数进行初始化。由于这只返回指针,如果我想创建一个返回 A* 的对象,但生成 B*,它是 A 的子代,那么不会有问题,因为 {{1 }} 可转换为 B*。我想将这些存储在一个向量中,但我并不真正关心生成的类型是 A* 还是 B,只关心它是 C 的孩子。我想做类似的事情:

A

唯一的问题是,据我所知,没有办法指定构造函数的模板参数。最后我使用了一个解决方法,但我没有找到一个很好的解释为什么会这样。我发现的最详细的一个,谈到构造函数实际上并不拥有这样的名称,但如果这是唯一可以解决的问题,它肯定可以通过:template<class RET_TYPE> class Generator { public: template <class GEN_TYPE, class... Args> requires requires (Args...){ { new GEN_TYPE(Args...) } -> std::convertible_to<RET_TYPE*>; } Generator (Args...) { /* Implementation */ } RET_TYPE getObject() { /* Implementation */} }; 来解决,不是吗?我看到的问题是名称解析,但这应该不是问题,因为它是明确的。

1 个答案:

答案 0 :(得分:2)

这是标准中的解释,[temp.arg.explicit]/8

<块引用>

[注4:因为显式模板参数列表跟在函数模板名称之后,并且因为构造函数模板([class.ctor])是在不使用函数名称([class.qual])的情况下命名的,所以没有办法为这些函数模板提供一个显式的模板参数列表。 — 尾注]

还有[class.ctor.general]/1

<块引用>

构造函数没有名字。