检索shared_ptr删除器的typeid?

时间:2017-06-27 19:07:05

标签: c++ stl type-erasure

(有关背景信息,可能有助于首先阅读shared_ptr without RTTI?。或者可能没有。)

出于好奇,我正在查看shared_ptr的界面 - 也就是说,这个问题是不是是由一个真实的用例激发的,而只是在质疑我是否缺席一些东西。我看到shared_ptr对其删除操作进行了类型删除,类似于std::anystd::function。在后两种情况下,标准总是给我们一对type- unerasure 函数:一个告诉已删除对象的确切typeid,另一个告诉我们原始对象在编译时猜测它的原始类型(如果不是,"go fish!")。

int xx = 42;
using Type = decltype(xx);
std::any a = xx;
assert( a.type() == typeid(Type) );
assert( std::any_cast<Type>(a) == 42 );

int (*xx)() = +[]() { return 42; };
using Type = decltype(xx);
std::function<long()> f = xx;
assert( f.target_type() == typeid(Type) );
assert( *f.target<Type>() == xx );

void (*xx)(int *) = +[](int *x) { delete x; };
using Type = decltype(xx);
std::shared_ptr<int> p(new int, xx);
/* assert( ??? == typeid(Type) ); */
assert( *std::get_deleter<Type>(p) == xx );

我认为这些类型的无法访问的疯狂不同的拼写作为课程的标准。但令我惊讶的是,typeid似乎没有“获得shared_ptr”访问者!我只是在cppreference上遗漏了一些东西吗?或者是否有技术原因难以提供这一特定功能?或者它只是shared_ptr规范中的随机漏洞,即历史原因?

(同样,我不能想到任何用例,而恕我直言,如果functionshared_ptr都不允许类型 - 重新发送,那将是更好的选择;但是因为他们,我想知道为什么它如此不协调。)

0 个答案:

没有答案