Извините за загадочное название. Предположим, что это определение:
struct TestNode {
using CostType = double;
};
Я хотел бы иметь возможность определить шаблон класса следующим образом:
template <typename NodeP,
typename MyPolicy = /* CostType of the node type corresponding to NodeP */ >
struct TT {
};
В приведенном выше определении NodeP
может быть либо простым , либо умным указателем для класса, который определяет CostType
, например TestNode
. Проблема: как указать значение по умолчанию для параметра шаблона MyPolicy
как CostType
типа node, соответствующее NodeP
?
Вот мое решение:
// 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 {
};
Существует ли более простой подход к этой проблеме? В частности, мне не хватает стандартной библиотеки, которая упростит решение?