考虑下面的代码示例:
#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 auto
和operator 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;
};