为什么不能为构造函数模板指定模板参数
Why can't you specify template argument for constructor template
前段时间我想写一个 class 可以 return 指向一个类型的指针,它一直用相同的参数初始化。由于这只有 returns 个指针,如果我想创建一个对象 returning A*
,但生成 B*
,它是 A
的子对象,那么不会有问题,因为 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 */}
};
唯一的问题是,据我所知,无法指定构造函数的模板参数。最后我使用了一个解决方法,但我没有找到一个很好的解释来解释为什么会这样。我找到了最详细的一个,谈到构造函数实际上并不拥有这样的名称,但如果这是唯一的问题,它肯定可以通过以下方式解决:Generator<class template><Constructor template>()
,不是吗?我看到的问题是名称解析,但这应该不是问题,因为它是明确的。
这是标准的解释,[temp.arg.explicit]/8:
[Note 4: Because the explicit template argument list follows the function template name, and because constructor templates ([class.ctor]) are named without using a function name ([class.qual]), there is no way to provide an explicit template argument list for these function templates. — end note]
Constructors do not have names.
前段时间我想写一个 class 可以 return 指向一个类型的指针,它一直用相同的参数初始化。由于这只有 returns 个指针,如果我想创建一个对象 returning A*
,但生成 B*
,它是 A
的子对象,那么不会有问题,因为 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 */}
};
唯一的问题是,据我所知,无法指定构造函数的模板参数。最后我使用了一个解决方法,但我没有找到一个很好的解释来解释为什么会这样。我找到了最详细的一个,谈到构造函数实际上并不拥有这样的名称,但如果这是唯一的问题,它肯定可以通过以下方式解决:Generator<class template><Constructor template>()
,不是吗?我看到的问题是名称解析,但这应该不是问题,因为它是明确的。
这是标准的解释,[temp.arg.explicit]/8:
[Note 4: Because the explicit template argument list follows the function template name, and because constructor templates ([class.ctor]) are named without using a function name ([class.qual]), there is no way to provide an explicit template argument list for these function templates. — end note]
Constructors do not have names.