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

C++ - Deducing type from inherited constructor's arguments for class template

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

如果我明确指定类型,那行得通。或者,如果我重新实现构造函数并调用 base 的构造函数,那也可以,但是有没有办法不用它呢?

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
}

but is there a way to do without that?

是的,只需为 CTestDer 添加 user-defined deduction guides:

template<typename T>
CTestDer(T) -> CTestDer<T>;

Demo

您可以添加一个user-defined deduction guide:

#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.
}

再多做一点工作,应该可以:

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

这应该可以处理任何事情。但这将是很多工作。对于这个简单的用例,如果预计超类不会发生太大变化,那就太过分了。