謎のタイトルに対する謝罪。この定義を仮定しますスマートポインタでラップされたクラスのメンバに簡単にアクセスできる方法はありますか?
struct TestNode {
using CostType = double;
};
私はこのようなクラステンプレートを定義できるようにしたいと思います:上記の定義では
template <typename NodeP,
typename MyPolicy = /* CostType of the node type corresponding to NodeP */ >
struct TT {
};
、NodeP
が単純またはスマートポインタへのいずれかになりますCostType
を定義するクラス、たとえばTestNode
です。問題:NodeP
に対応するノードタイプのCostType
であるために、MyPolicy
テンプレートパラメータのデフォルト値をどのように指定できますか?ここで
は、これまでのところ私のソリューションです:
// like std::remove_pointer, but works with smart pointers as well
template <typename PT> struct my_remove_pointer {
using type = typename
std::remove_reference< decltype(*((PT)nullptr)) >::type;
};
struct TestNode {
using CostType = double;
};
template <typename NodeP,
typename MyPolicy = typename my_remove_pointer<NodeP>::type::CostType>
struct TT {
};
は、この問題に対する簡単な方法はありますか?特に、ソリューションをよりシンプルにする標準的なライブラリ機能が欠けていますか?スマートポインタを逆参照して.get()
サポートしているので
'((PT)nullptr)' 'のstd :: declval() 'で置き換えられてもよいです。 –
Jarod42
を使用し、別名を使用して使用します: 'テンプレート my_remove_poiner_t = typename std :: remove_reference ())> :: type;' –
Jarod42