重载函数的特征
Traits of overloaded functions
我正在尝试使用 const/non const 重载获取 return 类型的函数。
struct TestClass {
const int* getPtr() const { return ptr; }
int* getPtr() { return ptr; }
private:
int* ptr;
};
using return_ptr_type = typename std::invoke_result<decltype(&TestClass::getPtr), TestClass>::type;
static_assert(std::is_same<return_ptr_type, int*>::value);
编译器抱怨无法解析重载函数的地址。我明白为什么会这样,但不知道如何解决。
注意:我看到关于如何解决重载之间堆栈溢出的其他问题,但它们处理具有不同函数参数的重载,而不是 const 重载。
在decltype(&TestClass::getPtr)
中不会发生重载解析;编译器甚至没有上下文可以选择。
您可以通过调用getPtr()
const 或非const 对象来获取return 类型,使重载决议生效。例如
using return_ptr_type1 = decltype(std::declval<TestClass>().getPtr());
static_assert(std::is_same<return_ptr_type1, int*>::value);
using return_ptr_type2 = decltype(std::declval<const TestClass>().getPtr());
static_assert(std::is_same<return_ptr_type2, const int*>::value);
我正在尝试使用 const/non const 重载获取 return 类型的函数。
struct TestClass {
const int* getPtr() const { return ptr; }
int* getPtr() { return ptr; }
private:
int* ptr;
};
using return_ptr_type = typename std::invoke_result<decltype(&TestClass::getPtr), TestClass>::type;
static_assert(std::is_same<return_ptr_type, int*>::value);
编译器抱怨无法解析重载函数的地址。我明白为什么会这样,但不知道如何解决。
注意:我看到关于如何解决重载之间堆栈溢出的其他问题,但它们处理具有不同函数参数的重载,而不是 const 重载。
在decltype(&TestClass::getPtr)
中不会发生重载解析;编译器甚至没有上下文可以选择。
您可以通过调用getPtr()
const 或非const 对象来获取return 类型,使重载决议生效。例如
using return_ptr_type1 = decltype(std::declval<TestClass>().getPtr());
static_assert(std::is_same<return_ptr_type1, int*>::value);
using return_ptr_type2 = decltype(std::declval<const TestClass>().getPtr());
static_assert(std::is_same<return_ptr_type2, const int*>::value);