【发布时间】:2020-11-09 19:53:26
【问题描述】:
已编辑:我忘记了回调“捕获”outer 的 this 指针。
我正在尝试初始化某个类及其成员。
该类没有模板化。
它的成员是模板化的。它采用模板的“函数类型”来进行封装类的回调。 (我不能使用std::function,因为这是时间关键代码。)
此外,我希望编译器会推断出回调对象的模板类型(给成员。)
代码看起来像这样(假设所有样板都存在):
template<typename func_t>
class inner : public inner_abstract_base
{
public:
func_t m_cb;
inner(func_t cb):m_cb(cb){}
};
class outer
{
Int member_fun(int);
public:
/*********first try****************/
// inner member{[this]{return this->member_fun(123);}}
/*********second try***************/
// inner member;
// outer():member([this]{return this->member_fun(321);})
// {}
/*********third try****************/
// auto lamb = [this]{return this->member_fun(987);};
//This or in the constructor initialization list
// inner<decltype(lamb)> member{lamb};
/*********fourth try***************/
// friend int func();
// inner<decltype(func)> member{func};
/*********fifth try***************/
// std::unique_ptr<inner_abstract_base> member_p;
// outer():member_p([]{return 666;})
// {}
/*********sixth try***************/
// inner<decltype(some_free_func)> member{some_free_func};
};
第一次尝试
我不确定为什么它不起作用。我猜在这种类型的初始化中(在类定义中)编译器不会猜测模板类型。可能是因为它使用了聚合初始化(是吗?如果是,为什么聚合初始化不支持模板类型推导)
第二次尝试
这不起作用,因为在定义中没有给出模板参数。仅在构造函数中调用它(在运行时),因此无法进行模板类型推导。
第三次尝试
非静态成员不能用auto 声明(为什么??) - 所以成员lamb 一开始就不能被初始化。
第四次尝试
我不喜欢这种方法,因为它比原始设计更进一步,但尽管如此 - 由于某种我无法理解的原因,它不起作用。
第五次尝试
这太过分了。我认为这个不起作用,因为我没有正确使用它。可能是因为我没有将它转换为儿子类型进行分配......(如何?)。即使使用“正确”的用法,类型推导也可能不适用于带有指针的设备。
第六次尝试
只是为了好玩 - 免费的乐趣!与朋友功能不起作用的原因相同(合理)。
底线
在捕获/不捕获this 指针的情况下,您如何解决这个惨败?
如何让编译器推导出成员变量的类型?
或者在给定的情况下更具体?
*我很抱歉来回编辑...
【问题讨论】:
-
C++17(或 C++20),我想。
-
第 6 个应该是:
inner<decltype(&some_free_func)> member{&some_free_func}; -
第 5 个应该是
outer():member_p(std::unique_ptr{new Inner{[]{return 666;}}}) {}(CTAD 使用了两次)。
标签: c++ class templates type-deduction