Возможно, вы могли бы сделать шаблон operator()
(поэтому нет необходимости явно указывать параметр шаблона, определяющий умный указатель) и использовать SFINAE, чтобы включить operator()
только для разрешенных типов
struct GPointerDeleter
{
template <typename T>
typename std::enable_if<std::is_same<T, GstElement>::value
|| std::is_same<T, GstBus>::value
/* or other cases */
>::type operator() (T * p) const
{ gst_object_unref(p); }
};
Или, может быть, лучше, вы можете добавить (как предложено Jarod42 (спасибо)) static_assert()
проверку внутри operator()
struct GPointerDeleter
{
template <typename T>
void operator() (T * p) const
{
static_assert( std::is_same<T, GstElement>::value
|| std::is_same<T, GstBus>::value
/* or other cases */, "some error message" );
gst_object_unref(p);
}
};