考虑下面的代码示例:

#include <algorithm>

template<class T, class U>
struct lazy_caller{
    lazy_caller(T &&one, U &&two) : m_one(one), m_two(two){}

    operator decltype(std::max(T(), U()))() const {
        return std::max(m_one, m_two);
    }

    T m_one;
    U m_two;
};

int main()
{
    lazy_caller<int, int> caller(1, 2);
    int i = caller;
    return 0;
}

就像您想象的那样,在实际代码中,我想进行更复杂的类型推导以创建适当的转换运算符。无论如何-此代码无法在VS2017中编译(我想与早期版本相同)-所以我想问一下此问题是否有任何解决方法?我已经尝试过:
operator auto () const

它还会生成编译器错误,例如:
source_file.cpp(8): error C2833: 'operator function-style cast' is not a recognized operator or type

使用msvc可以解决此问题吗?
因为gcc对operator autooperator decltype(..)都没有问题。

最佳答案



通过using别名怎么办?

using maxType = decltype(std::max(T(), U()));

operator maxType () const {
    return std::max(m_one, m_two);
}

或者,也许更好用std::declval()
using maxType = decltype(std::max(std::declval<T>(), std::declval<U>()));

如果这不起作用,则可以尝试使用lazy_caller类的第三种默认模板类型;否则,请执行以下步骤。就像是
template <typename T, typename U,
   typename R = decltype(std::max(std::declval<T>(), std::declval<U>()))>
struct lazy_caller
 {
   lazy_caller(T && one, U && two) : m_one(one), m_two(two)
    { }

   operator R () const
    { return std::max(m_one, m_two); }

   T m_one;
   U m_two;
 };

08-18 00:34