【问题标题】:Why can't you specify template argument for constructor template为什么不能为构造函数模板指定模板参数
【发布时间】:2021-09-25 17:04:41
【问题描述】:

不久前,我想编写一个可以返回指向类型的指针的类,该类型始终使用相同的参数进行初始化。由于这只返回指针,如果我想创建一个返回 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&lt;class template&gt;&lt;Constructor template&gt;(),不是吗?我看到的问题是名称解析,但这应该不是问题,因为它是明确的。

【问题讨论】:

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


    【解决方案1】:

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

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

    还有[class.ctor.general]/1

    构造函数没有名字。

    【讨论】:

    • 我明白了,但是人们编写了这个标准,所以有没有理由省略将模板传递给构造函数的方法(就像它会导致的技术问题)?
    • @Lala5th 我认为委员会只是不想为构造函数模板制作这种特殊的语法,并且模板参数推导在大多数情况下都可以正常工作。
    • 我没有考虑过,但看起来很公平
    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2014-05-19
    • 2016-02-25
    • 2020-01-14
    • 2019-09-14
    相关资源
    最近更新 更多