3

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

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]);

buffer是一个std::shared_ptr<std::vector<uint8_t>>
someTypeuint32_t

我收到以下错误消息:

错误:从类型'__gnu_cxx::__alloc_traits >::value_type {aka unsigned char}'到类型'uint32_t& {aka unsigned int&}'的无效静态转换</p>

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

如果我可以在someType没有类实例的情况下提取 ,进一步的改进将是。但是我不知道如何实现这一点,而我可以通过 std lib 获得没有指针的类,例如:

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

我不知道如何以我可以在someType不知道课程的情况下获得课程的一部分的形式编写此内容。我可以写类似下面的东西,但是我仍然必须明确地传递类 naem 和 typename,有没有办法自动提取这些?此外,以下内容首先没有编译(http://ideone.com/8VlKO4):#include using namespace std;

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;
}
4

1 回答 1

4

坦率地说,理解你想要达到的目标有点困难,所以我将专注于更新的部分。

显然,您不能将类型(派生自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”。

于 2014-04-04T01:11:38.040 回答