如何确定C++11成员函数的返回类型
How can I determine the return type of a C++11 member function
我正在尝试确定各种C++成员函数的返回类型。我知道decltype和std::declval可以用来做这件事,但我在语法和查找有用的示例方面遇到了问题。下面的CCD_ 1显示了一个哑类的示例,该类包含静态和普通成员函数的混合——带有&没有参数和返回类型。根据所讨论的方法,我希望能够声明来自各个方法的返回类型向量。
在我的应用程序中,这些方法是对std::async
的回调,我需要一个std::future<return types>
的向量。我尝试过各种声明,比如decltype(std::declval(TestCBClass::testStaticMethod))
(我不确定是否需要在方法名称之前加一个&
)。这种语法是不正确的——当然它不会编译,但我认为这是应该使用的方法。
class TestCBClass {
public:
TestCBClass(const int& rValue = 1)
: mValue(rValue) {
std::cout << "~TestCBClass()" << std::endl;
}
virtual ~TestCBClass() {
std::cout << "~TestCBClass()" << std::endl;
}
void testCBEmpty(void) {
std::cout << "testCBEmpty()" << std::endl;
}
int testCBArgRet(const int& rArg) {
std::cout << "testCBArgRet(" << rArg << ")" << std::endl;
mValue = rArg;
}
static void testCBEmptyStatic(void) {
std::cout << "testCBEmptyStatic()" << std::endl;
}
static void cbArgRetStatic(const SLDBConfigParams& rParams) {
std::lock_guard<std::mutex> lock(gMutexGuard);
std::cout << rParams.mPriority << std::endl;
}
static std::string testStaticMethod(const PriorityLevel& rPrty) {
return "this is a silly return string";
}
private:
int mValue;
};
如果您喜欢列出参数类型而不是相应的伪值,也可以使用std::result_of
和decltype
,如下所示:
#include <iostream>
#include <utility>
#include <type_traits>
struct foo {
int memfun1(int a) const { return a; }
double memfun2(double b) const { return b; }
};
int main() {
std::result_of<decltype(&foo::memfun1)(foo, int)>::type i = 10;
std::cout << i << std::endl;
std::result_of<decltype(&foo::memfun2)(foo, double)>::type d = 12.9;
std::cout << d << std::endl;
}
演示在这里。
如何确定C++11成员函数的返回类型
答案:
您可以像下面的玩具示例一样使用decltype
和std::declval
:
#include <iostream>
#include <utility>
struct foo {
int memfun1(int a) const { return a; }
double memfun2(double b) const { return b; }
};
int main() {
decltype(std::declval<foo>().memfun1(1)) i = 10;
std::cout << i << std::endl;
decltype(std::declval<foo>().memfun2(10.0)) d = 12.9;
std::cout << d << std::endl;
}
现场演示
我尝试过各种声明,例如decltype(std::declval(TestCBClass::testStaticMethod))
不必使用TestCBClass
0并传递实际参数,甚至不必传递它们的类型就可以知道静态/非静态成员函数的返回类型是什么。相反,您可以编写自己的特性来了解给定函数的返回类型:
template <typename T>
struct return_type;
template <typename R, typename... Args>
struct return_type<R(*)(Args...)> { using type = R; };
template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...)> { using type = R; };
template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) const> { using type = R; };
template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) volatile> { using type = R; };
template <typename R, typename C, typename... Args>
struct return_type<R(C::*)(Args...) const volatile> { using type = R; };
template <typename T>
using return_type_t = typename return_type<T>::type;
...
TestCBClass t;
std::future<return_type_t<decltype(&TestCBClass::testCBArgRet)>> a =
std::async(&TestCBClass::testCBArgRet, t, 1);
std::future<return_type_t<decltype(&TestCBClass::testCBEmpty)>> b =
std::async(&TestCBClass::testCBEmpty, t);
std::future<return_type_t<decltype(&TestCBClass::testCBEmptyStatic)>> c =
std::async(&TestCBClass::testCBEmptyStatic);
DEMO
编译时推导返回类型的最新语法如下:
std::invoke_result_t<decltype(&Presenter::present), Presenter, QSqlQuery &> someVariable;
让我们考虑一个例子,你想构造一个具有默认值的对象,例如QVector<int>()
,但你需要从模板参数推导出这种类型,在我们的例子中是模板参数Presenter
,我们需要推导出具有一个参数Presenter::present(QSqlQuery &)
:的类方法的返回类型
template<typename Presenter>
inline auto defaultReturnValue() const
{
return std::invoke_result_t<decltype(&Presenter::present), Presenter, QSqlQuery &>();
}
上面的代码推导出这个类的返回类型:
class VectorPresenter final
{
public:
QVector<int> present(QSqlQuery &query) const;
};
最后,您将致电:
const auto defaultValue = defaultReturnValue<VectorPresenter>();
结果将是defaultValue
变量中的QVector<int>
实例。现在,您可以创建一个演示者类,它将返回任何类型,并且您将能够推导出该类型。 ✨
- 如何获取std::result_of函数的返回类型
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 函数作为模板参数,是否对返回类型强制约束
- C++中函数的向量返回类型引发错误
- 检查函数返回类型是否与STL容器类型值相同
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 为什么 c++(g++) 不允许模板返回类型和函数名称之间有空格?
- 为什么返回类型的'const'限定符对标有 __forceinline/内联的函数没有影响?
- 在 c++ 中将函数返回类型指定为模板参数
- 使用 SWIG 更改生成的 CS 函数中的返回类型
- C++ 这里有一个返回 (24) 的布尔返回类型函数
- 使用SFINAE来检测void返回类型函数的存在
- 模板返回类型函数如何在C++中工作
- 如何在返回类型函数模板的专用化中使用派生类型?( "couldn't infer template argument" )
- Bon appetit :从 int 返回类型函数在 main() 中打印字符串
- 在引用或指针返回类型函数上输入
- 在后面的返回类型函数语法中,auto关键字背后是否有意图
- 我可以在c++中重写字符串返回类型函数吗?