不久前,我想编写一个类,该类可以返回指向某个类型的指针,该类始终使用相同的参数进行初始化。由于这只返回指针,如果我想创建一个返回 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 */}
};
来解决,不是吗?我看到的问题是名称解析,但这应该不是问题,因为它是明确的。
答案 0 :(得分:2)
这是标准中的解释,[temp.arg.explicit]/8:
<块引用>[注4:因为显式模板参数列表跟在函数模板名称之后,并且因为构造函数模板([class.ctor])是在不使用函数名称([class.qual])的情况下命名的,所以没有办法为这些函数模板提供一个显式的模板参数列表。 — 尾注]
<块引用>构造函数没有名字。