C ++ функция преобразования вопроса - PullRequest
3 голосов
/ 15 ноября 2010

Я попытался использовать оболочку 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;

Я действительно хочу иметь возможность проверить возможность такого преобразования во время компиляции, поэтому, если кто-нибудь знает, как реализовать это, я был бы признателен.

Спасибо.

Ответы [ 2 ]

1 голос
/ 15 ноября 2010

В дополнение к тому, что написал @James, кажется, вы скорее хотите иметь что-то вроде is_callable. Эти шаблоны классов обрабатывают указатели функций / функций и классы объектов функций или ссылки на них для максимум 5 параметров.Используйте их на свой страх и риск:)

1 голос
/ 15 ноября 2010

boost::is_convertible возвращает true, когда вы проверяете, может ли любой тип быть преобразованным в любой boost::function тип, потому что boost::function имеет шаблон конструктора преобразования, который принимает любой тип.

Поскольку этот конструктор преобразования существует, я не знаю, как можно легко проверить, является ли тип на самом деле преобразованным в std::function.

...