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>;
您可以添加一个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.
}
再多做一点工作,应该可以:
- 在演绎指南中使用可变参数模板
- 让演绎指南使用
decltype
构造,使用它自己的演绎指南,超类
- 使用特化来找出超类的模板参数
- 用它来构造子类,推导它
这应该可以处理任何事情。但这将是很多工作。对于这个简单的用例,如果预计超类不会发生太大变化,那就太过分了。
我有一个 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>;
您可以添加一个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.
}
再多做一点工作,应该可以:
- 在演绎指南中使用可变参数模板
- 让演绎指南使用
decltype
构造,使用它自己的演绎指南,超类 - 使用特化来找出超类的模板参数
- 用它来构造子类,推导它
这应该可以处理任何事情。但这将是很多工作。对于这个简单的用例,如果预计超类不会发生太大变化,那就太过分了。