次のソースコードが与えられます:
#include <memory>
#include <typeinfo>
struct Base {
virtual ~Base();
};
struct Derived : Base { };
int main() {
std::unique_ptr<Base> ptr_foo = std::make_unique<Derived>();
typeid(*ptr_foo).name();
return 0;
}
そしてそれをコンパイルしました:
clang++ -std=c++14 -Wall -Wextra -Werror -Wpedantic -g -o test test.cpp
環境設定:
linux x86_64
clang version 5.0.0
warning(-Werror
に注意)のためにコンパイルされません:
error: expression with side effects will be evaluated
despite being used as an operand to 'typeid'
[-Werror,-Wpotentially-evaluated-expression]
typeid(*ptr_foo).name();
(注:GCCはそのような潜在的な問題があるとは主張していません)
質問
そのような警告を生成せずに、unique_ptr
が指すタイプに関する情報を取得する方法はありますか?
注:私はnot-Wpotentially-evaluated-expression
の無効化または-Werror
の回避について話していません。
以下は警告なしで機能し、派生クラスに対して正しい結果を与えるように見えます
std::unique_ptr<Foo> ptr_foo = std::make_unique<Bar>();
if(ptr_foo.get()){
auto& r = *ptr_foo.get();
std::cout << typeid(r).name() << '\n';
}
std::unique_ptr<T>
タイプエイリアスstd::unique_ptr<T>::element_type
for T
。次のことを試してください。
int main()
{
auto ptr_foo = std::make_unique<Foo>();
typeid(decltype(ptr_foo)::element_type).name();
return 0;
}