gpt4 book ai didi

c++ - 获取成员类型 memberpointer 指向

转载 作者:行者123 更新时间:2023-12-04 20:42:26 27 4
gpt4 key购买 nike

我想提取成员指针指向的成员的类型。

template<someType myClass::*member>
void demo(myClass& instance, void* ptr) {
instance.*member = *reinterpret_cast<someType*>(ptr); // can the someType in this line be deduced from member?
}

我尝试使用 decltype正如评论中所建议的那样,但是我对此有疑问:

instance.*member= static_cast<decltype(instance.*member)>((*buffer)[offset]);

bufferstd::shared_ptr<std::vector<uint8_t>> ,
someTypeuint32_t

我收到以下错误消息:

error: invalid static_cast from type ‘__gnu_cxx::__alloc_traits >::value_type {aka unsigned char}’ to type ‘uint32_t& {aka unsigned int&}’

据我了解decltype(instance.*member)member定义为 uint32_t instance::*member产生一个引用 uint32_t&而不是 uint32_t .我试图按值传递实例,但错误仍然存​​在。我知道 std::remove_reference但是,我不明白引用文献最初是如何出现的。

进一步的改进是,如果我可以提取 someType没有类实例。但是我不知道如何实现这一点,虽然我可以通过像这样的标准库来获得没有指针的类:

template <T*>
struct removePointer {
typedef T type;
}

我不知道如何以我可以获得 someType 的形式来编写它类(class)的一部分,首先不知道类(class)。我可以写类似下面的东西,但是我仍然必须显式传递类 naem 和类型名,有没有办法自动提取它们?此外,以下内容首先不会编译( http://ideone.com/8VlKO4 ): #包括 使用命名空间标准;

template <class C,typename T, T C::*v>
struct getPointerType {
typedef T type;
};

class Test {
int value;
};

int main() {
int Test::*member=nullptr;
cout << typeid(getPointerType<Test, int, decltype(member)>::type) << std::endl;
return 0;
}

最佳答案

坦率地说,有点难以理解您要实现的目标,因此我将重点关注更新的部分。

显然,您不能将类型(派生自 decltype)作为值参数传递给模板。此外,您不能将非 constexpr 值作为模板参数传递(因此您不能将 member 变量粘贴到模板参数中并期望它编译)。

但是,您可以依靠编译器推断出正确的函数来调用非 costexpr 变量:

template <class C, typename T>
T getPointerType(T C::*v);

class Test {
int value;
};

int main() {
int Test::*member=nullptr;
cout << typeid(decltype(member)).name() << std::endl;
cout << typeid(decltype(getPointerType(member))).name() << std::endl;
return 0;
}

以上将打印:

M4Testi //int Test::*
i //int

当然,更“滥用”模板替换是可能的:

template <typename M>
struct getPointerType {
template <typename C, typename T>
static T get_type(T C::*v);

typedef decltype(get_type(static_cast<M>(nullptr))) type;
};

class Test {
int value;
};

int main() {
int Test::*member=nullptr;
cout << typeid(getPointerType<decltype(member)>::type).name() << std::endl;
return 0;
}

输出将是预期的“i”。

关于c++ - 获取成员类型 memberpointer 指向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22825512/

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