gpt4 book ai didi

c++ - 定义非静态成员时在 C++ 中获取 "this"的类型

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:34 27 4
gpt4 key购买 nike

我正在尝试做一些花哨的模板,但我无意中发现了一个问题:我想在定义非静态成员时在其定义中获取类的类型。这可能吗? (在任何 C++ 版本中。)


采用以下代码:

template<typename T>
struct inner {
T* this_;
/* fancy stuff... */
};

struct foo {
inner<foo> bar{this};
};

类(class)foo有一个非静态成员 bar用指针 foo* this 初始化的.此代码在 clang 和 gcc 中编译。

但我其实想要inner的定义出现在宏中,这意味着我没有字符串 fooinner<foo> bar{this} 行中使用.尝试使用:

inner bar{this};

在 C++17 中,允许类模板的模板参数推导,产生错误

error: use of class template 'inner' requires template arguments; argument deduction not allowed in non-static struct member inner bar{this};

我明白了。尝试:

inner<decltype(*this)> bar{this};

产生类似的错误:

error: invalid use of 'this' outside of a non-static member function inner<decltype(*this)> bar{this};


作为解决方法,我一直在使用以下奇怪的重复模板模式:

template<typename T>
struct SelfAwareType {
using myOwnType = T;
}

struct foo : SelfAwareType<foo> {
inner<myOwnType> bar{this};
};

最佳答案

如果您可以将所有 foo 限制为需要 typedef 'this_type',那么您的宏就不需要指定 foo。

template<typename T>
struct inner {
T* this_;
/* fancy stuff... */
};

struct foo {
typedef foo this_type ;
inner<this_type> bar{this};
};

这与您的“解决方法”基本相同,无需使用 crtp 并引入另一种类型。

关于c++ - 定义非静态成员时在 C++ 中获取 "this"的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50535587/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com