Можно сделать declval, чтобы не возвращать неправильный тип для Visual Studio 2010 - PullRequest
0 голосов
/ 08 ноября 2018

У меня есть следующий код, и я пытаюсь скомпилировать его в 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, то код компилируется. Они могут быть решением проблемы, если я не смогу найти что-то лучшее.

...