Я попытался использовать оболочку boost::function<x>
для хранения и преобразования моих функциональных объектов, и я хочу знать, существует ли проверка компиляции для "существует ли преобразование из произвольного типа T
в тип boost::function<x>
"?.
Вот пример кода:
struct Functor {
int operator()(int) {
return 5;
}
};
// Should not fire static assertion.
STATIC_ASSERT( (IS_CONVERTIBLE<Functor,
boost::function<int (int)> >::value) );
// Should fire static assertion.
STATIC_ASSERT( (IS_CONVERTIBLE<Functor,
boost::function<int (std::string)> >::value) );
Теперь - существует ли способ реализовать проверку IS_CONVERTIBLE
?
Я пытался использовать boost::is_convertible
проверку черты типа, но это дает true
для любого Functor
типа:
bool value1 = boost::is_convertible<Functor,
boost::function<int (int)> >::value;
bool value2 = boost::is_convertible<Functor,
boost::function<int (std::string)> >::value;
// At this point both 'value1' and 'value2' equal TRUE.
У меня также были следующие попытки:
// Here the results are also always TRUE.
bool value = boost::is_convertible<Functor,
boost::function1<int, int> >::value;
// This doesn't work, because unary functions are constructed via
// inheritance (the result is always FALSE).
bool value = boost::is_convertible<Functor,
std::unary_function<int, int>::value;
Я действительно хочу иметь возможность проверить возможность такого преобразования во время компиляции, поэтому, если кто-нибудь знает, как реализовать это, я был бы признателен.
Спасибо.