gpt4 book ai didi

c++ - 我无法让这个虚拟模板仿函数运算符返回正确的类型

转载 作者:行者123 更新时间:2023-11-30 02:23:10 25 4
gpt4 key购买 nike

我已经在这个领域工作了很长时间。基本上这个类接受一个类型,它可能是一个函数,还有一些参数:

template <typename T, typename ... Args>
struct HandlerBase
{
HandlerBase(T type, Args ... args) {}
HandlerBase() {}

auto operator()(Args ... args)
{ return std::declval<T>()(args...); } ;
};// This compiles

但现在我想让我的 operator() 成为虚拟的,我得到了错误:

"a virtual member function shall not have a return type that contains auto".

所以我需要手动设置返回类型,在我搜索之后我能尝试的最好的是:

virtual decltype(std::declval<T>()(std::declval<Args>()...)) 
operator()(Args ... args)
{ return std::declval<T>()(args...); } ;

或作为尾随返回

virtual auto operator()(Args ... args)
-> decltype(std::declval<T>()(std::declval<Args>()...))
{ return std::declval<T>()(args...); } ;

这些尝试是基于我之前获得的有关此主题的一些帮助。我真的发现解析这样的语句几乎是不可能的。

这就是整个事情的样子,以防有人想尝试一下:

#include <iostream>

template <typename T, typename ... Args>
struct HandlerBase
{
HandlerBase(T type, Args ... args) {}
HandlerBase() {}

virtual decltype(std::declval<T>()(std::declval<Args>()...)) operator()(Args ... args)
{ return std::declval<T>()(args...); } ;
};

int main()
{
auto lambda = []() { return 0; };
HandlerBase<decltype(lambda)> object;
}

在 Visual Studio 中,无论是正常返回语法还是尾随返回语法,我都得到了错误 我得到了一个链接器错误,这基本上是不可读的,但它提到了一些关于返回类型是 int 的事情,所以我认为我的实际定义在括号内可能是错的。

最佳答案

std::declval仅适用于未评估的上下文。作为其documentation on cppreference阅读:

Note that because no definition exists for declval, it can only be used in unevaluated contexts; it is an error to evaluate an expression that contains this function. Formally, the program is ill-formed if this function is odr-used.

当你写 std::declval<T>()(args...)它尝试使用引用 declval 调用函数调用运算符返回。这是一个 odr-use,链接器必须查找它。它找不到它,因此出现错误。

它仅在您添加虚拟说明符时触发,因为虚拟函数是隐式使用的(主要是因为它们必须是为了添加动态调度支持)。

如果没有虚拟说明符,您的 operator() 的函数体在尝试调用它之前永远不会实例化(因为 HandlerBase<> 是一个模板类)。但是,如果您尝试调用 operator(),您会得到完全相同的链接器错误。在你原来的“工作”版本中。

关于c++ - 我无法让这个虚拟模板仿函数运算符返回正确的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46418682/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com