当前位置: 首页 > 知识库问答 >
问题:

decltype(auto)、trailing return type和sfinae:我们能把它们混合在一起吗?

寿卜鹰
2023-03-14

考虑以下代码:

auto f() -> decltype(auto) { /* do whatever you want here */ }
int main() { f(); }

导出返回类型,并将decltype(auto)用作尾部返回类型
下面的代码是一个稍加修改的版本(实际上是sfinae版本):

struct S { static void f() {} };
struct T {};

template<typename U>
auto f(int) -> decltype(U::f(), void()) {
    // do whatever you want here
}

template<typename>
auto f(char) -> decltype(auto) {
    // do whatever you want here
}

int main() {
    f<S>(0);
    f<T>(0);
}

如果你参加了这个功能的考试:

template<typename U>
auto f(int) -> decltype(U::f(), void()) {
    // do whatever you want here
}

问题是:是否可以使用尾随返回类型来执行sfinae,并且仍然可以推断返回类型
我指的是下面的代码(当然不起作用):

template<typename U>
auto f(int) -> decltype(U::f(), auto) {
    // do whatever you want here
}

注意:我不是在寻找涉及模板参数的替代方法,我知道它们,我只是想知道这是否是一个可行的解决方案。

共有3个答案

那正初
2023-03-14

不是答案,而是使用void\u t的一种可能的解决方法。

至少它和你想做的一样干燥:

template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;


struct S { static int f() { return 3; } };
struct P { static int p() { return 4; } };
struct T {};

template<typename U, void_t<decltype(U::f())>* = nullptr >
auto f(int) -> decltype(auto)
{
    // do whatever you want here
    std::cout << "f1\n";
    return U::f();
}

template<typename U, void_t<decltype(U::p())>* = nullptr >
auto f(int) -> decltype(auto)
{
    // do whatever you want here
    std::cout << "f3\n";
    return U::p();
}

template<typename>
auto f(char) -> decltype(auto) {
    std::cout << "f2\n";
    // do whatever you want here
}

int main() {
    std::cout << f<S>(0) << '\n';
    std::cout << f<P>(0) << '\n';
    f<T>(0);
}
罗河
2023-03-14

您可以向函数添加另一个val(*)()类型的参数,并为其分配一个带有尾随返回类型的lambda作为默认参数,以便可以通过lambda应用SFINAE:

template<typename U>
decltype(auto) f(int, void(*)() = []()->decltype(U::f(), void()) {})
{
    // do whatever you want here
}
习哲彦
2023-03-14

decltype(auto)是一个不可分割的结构(几乎就像它是一个像decltype_auto这样的关键字)。除此之外,auto不能在decltype(x)中用作独立的实体,因为这会阻止x成为有效的表达式

 类似资料:
  • 校验者: @片刻 翻译者: @X 模型管道化 我们已经知道一些模型可以做数据转换,一些模型可以用来预测变量。我们可以建立一个组合模型同时完成以上工作: import numpy as np import matplotlib.pyplot as plt from sklearn import linear_model, decomposition, datasets from sklearn.p

  • 为了跨微服务跟踪服务调用,我们可以使用Zipkin。 从下面的网址,我们了解到通过微服务调用的时间可以在zipkin中捕获 https://tanzu.vmware.com/developer/guides/spring/spring-zipkin/ https://springhow.com/spring-boot-zipkin-distributed-tracing/ 我们还需要在使用zipk

  • istio 是由 Google、IBM、Lyft 等共同开源的 Service Mesh(服务网格)框架,于2017年初开始进入大众视野。Kubernetes 解决了云原生应用的部署问题,istio 解决的是应用的服务(流量)治理问题。

  • 问题内容: 目前正在做一些考试,我正在努力学习一些概念。我的笔记中确实“提到”了所有这些内容,但我并不真正了解它们如何相互联系。据我了解: SOA-使服务使用者/提供者进行通信的解决方案。(据我了解,这是所有其他内容的总称) WSDL-一种描述提供程序服务的语言。 SOAP-服务用来发送消息的XML协议“包装器”。与WSDL协同工作以提供参数? REST-一种功能类似于SOAP但避免使用XML的设

  • 问题内容: 我刚刚开始使用JSF,看起来很棒,但是我似乎无法弄清楚这最后的障碍。 我习惯了传统的Jquery AJAX函数,这在我的书中很完美。但是我希望找到一种方法使其与JSF协调工作。 这是一个说明我的情况的方案。 我的网站上有一个消息传递页面,用户可以在其中互相发送消息。所以在我的xhtml页面中,我看起来像这样: 效果很好。用户可以发布他们的消息,并将其加载到上面的对话div中。但是现在我

  • 只是些反射型 XSS,单单发出来没有什么意义。 只是些反射型 XSS,腾讯怎么修都修不完。 只是些反射型 XSS,我想让它变得更有价值。 只是些反射型 XSS,我拿他们做成了教程。