C++ - 从类模板的继承构造函数的参数中推导类型

New*_*ine 5 c++ class-template template-argument-deduction c++20

我有一个继承基类模板的构造函数的类模板。(对于c++20)有没有办法从基类的构造函数参数推导出派生类的模板参数?

如果我明确指定类型,那就有效。或者,如果我重新实现构造函数并调用基类的构造函数,这也可以工作,但是有没有办法做到这一点?

template<typename T>
struct CTestBase
{
    using Type = T;

    CTestBase() = default;
    CTestBase(T t){}
};

template<typename T>
struct CTestDer : public CTestBase<T>
{
    using CTestBase<T>::CTestBase;
};

void test()
{
    //CTestDer der(int{}); //ERROR
    CTestDer<int> der(int{}); //OK
}
Run Code Online (Sandbox Code Playgroud)

Sam*_*hik 8

您可以添加用户自定义的扣费指南

#include <utility>

template<typename T>
struct CTestBase
{
    using Type = T;

    CTestBase() = default;
    CTestBase(T t){}
};

template<typename T>
struct CTestDer : public CTestBase<T>
{
    using CTestBase<T>::CTestBase;
};

template<typename T>
CTestDer(T &&t) -> CTestDer<std::remove_cvref_t<T>>;

void test()
{
    CTestDer der(int{}); // OK now.
}
Run Code Online (Sandbox Code Playgroud)

通过多一点工作,应该可以:

  1. 在推导指南中使用可变参数模板
  2. 让演绎指南使用decltype它自己的演绎指南来构造超类
  3. 使用专门化来找出超类的模板参数
  4. 用它来构造子类,并推导它

这应该可以处理任何事情。但这将需要大量工作。对于这个简单的用例,如果预计超类不会发生太大变化,那么这就有点矫枉过正了。


康桓瑋*_*康桓瑋 5

但有没有办法不这样做呢?

是的,只需添加用户定义的扣除指南CTestDer

template<typename T>
CTestDer(T) -> CTestDer<T>;
Run Code Online (Sandbox Code Playgroud)

演示