У меня есть следующий код, и я пытаюсь скомпилировать его в Visual Studio 2010. Я должен поддерживать устаревшего клиента, поэтому в настоящее время обновление невозможно.
#include <boost/utility.hpp>
#include <boost/static_assert.hpp>
#include <type_traits>
struct Foo {
static Foo CreateFoo(int p){return Foo();}
};
template <typename F, typename A0>
struct ResultOf {
typedef decltype(boost::declval<F>()(boost::declval<A0>())) Type;
};
typedef ResultOf<decltype(&Foo::CreateFoo),int>::Type ResultType;
BOOST_STATIC_ASSERT(!std::is_reference<ResultType>::value);
Статическое утверждение завершается неудачно , поскольку возвращается тип ссылки, а не тип значения.
Я знаю, что поддержка decltype в Visual Studio 2010 отрывочна. Однако можно ли заставить вышеописанное работать корректно, только изменив выражение decltype
typedef decltype(boost::declval<F>()(boost::declval<A0>())) ResultType;
Мне нужна только надежная поддержка для функций, которые принимают один аргумент и возвращают значение или ссылку .
Я также заметил, что если CreateFoo является свободной функцией, а не статическим методом Foo, то код компилируется. Они могут быть решением проблемы, если я не смогу найти что-то лучшее.