how to make argument deduction work for derived class which using base class constructor?(如何使使用基类构造函数的派生类的参数演绎工作?)
问题描述
当派生类使用基类构造函数时,演绎似乎总是fail。然而,当基类有许多构造函数时,重新定义所有构造函数是非常笨拙的。当基类使用新的构造函数快速演变时,这也是一件痛苦的事情。这个老问题是在两年多前提出的,所以我想知道:到2020年,当c++17和c++2a可用时,有什么办法可以解决这个问题吗?
template<typename ...As>
class base_t
{
public:
base_t(As... args){}
};
template<typename ...As>
class A_t: public base_t<As...>
{
public:
A_t(As... args): base_t<As...>{args...} {};
};
template<typename ...As>
class B_t: public base_t<As...>
{
using base_t<As...>::base_t;
};
int main()
{
base_t a{1, 2.0f};
A_t{1, 2.0f};
B_t{1, 2.0f}; //fails unless explicitly specialize the template
return 0;
}
根据@Sam和@Barry:
更新演绎指南很有帮助。然而,对于稍微复杂的情况,它仍然失控:
template <typename A>
struct D_t {
A x;
D_t(A x) :x{x} {}
};
template<typename A, typename B>
class base2_t
{
public:
base2_t(A a, B b){std::cout << "1
";}
base2_t(A a, D_t<B> c, int x){std::cout << "2
";}
base2_t(A a, B b, int x){std::cout << "3
";}
base2_t(A a, B b, int x, float y){std::cout << "4
";}
explicit base2_t(A(*fp)(B)){std::cout << "5
";}
// if we have lots of similar things like above
// we will quickly end up write lots of different
// guides.
};
template<typename A, typename B>
class C_t: public base2_t<A, B>
{
using base2_t<A, B>::base2_t;
};
template<typename A, typename B, typename ...As>
C_t(A, B, As...)->C_t<A, B>;
template<typename A, typename B>
C_t(A(*)(B))->C_t<A, B>;
float func1(int x)
{
return x;
}
int main()
{
C_t{1, 2.0f, 3};
base2_t{1, D_t{2.0f}, 3};
C_t{1, D_t{2.0f}, 3}; // this is wrong, we have to deal with it by checking types and write different guides.
base2_t{&func1};
C_t{&func1};
}
推荐答案
能够从基类继承演绎指南是proposed在C++20中。但是,此功能没有实现,正如最后一行所说:
来自继承的构造函数的CTAD的措辞没有在C++20委员会草案中及时敲定,将在以后的某个时间点在单独的措辞文件中发布。
因此,从现在起,您将需要显式地为派生类提供演绎指南(或者像为A_t
那样定义构造函数)。希望这个问题将在c++23中得到解决。
这篇关于如何使使用基类构造函数的派生类的参数演绎工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何使使用基类构造函数的派生类的参数演绎工作?
基础教程推荐
- 如何定义双括号/双迭代器运算符,类似于向量的向量? 2022-01-01
- 您如何将 CreateThread 用于属于类成员的函数? 2021-01-01
- C++,'if' 表达式中的变量声明 2021-01-01
- 调用std::Package_TASK::Get_Future()时可能出现争用情况 2022-12-17
- C++ 程序在执行 std::string 分配时总是崩溃 2022-01-01
- C++ 标准:取消引用 NULL 指针以获取引用? 2021-01-01
- 运算符重载的基本规则和习语是什么? 2022-10-31
- 设计字符串本地化的最佳方法 2022-01-01
- 什么是T&&(双与号)在 C++11 中是什么意思? 2022-11-04
- 如何在 C++ 中处理或避免堆栈溢出 2022-01-01