首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用std::declval查找模板函数的返回值?

如何使用std::declval查找模板函数的返回值?
EN

Stack Overflow用户
提问于 2021-06-02 20:42:53
回答 2查看 175关注 0票数 0

我有一个类B,它接受一个模板参数,比如A。我创建一个B b并调用B::operator()(A a)。不管a的类型如何,b(a)都应该返回一个double。我想用 B外部推导出这个decltype

如果我有一个函数B::operator()(),我可以用

代码语言:javascript
复制
std::declval<B&>()()

这是在我的另一个问题here中向我提出的。(请注意,这个问题中的AB与上一个问题中的AB不匹配。)

如果我有一个函数B::operator()(int i) (没有模板),我可以用

代码语言:javascript
复制
std::declval<B>()(int())

虽然这似乎只起作用,因为int是默认的可构造的。

B::operator()()是一个模板函数时,我该如何做呢?

下面是一些在我的机器上编译的启动代码。你不应该为了理解这个问题而去看它。

代码语言:javascript
复制
#include <array>
#include <iostream>
#include <array>

class B {
public:
    B() {};

    template<typename T>
    double operator()(T t) {
        return t();
    }

};

class A {
public:
    A() {};

    double operator()() {
        return 3;
    }
};

int main() {
    A a{};
    B b{};
    std::cout << b(a);

    return 0;
}

编辑:

为了澄清,我想添加如下一行

代码语言:javascript
复制
using custom_typename = double;

对于上面的代码,除了double之外,我编写了如下内容

代码语言:javascript
复制
using custom_typename = decltype(std::declval<B>()());

适当地修改以接受返回类型的B::operator()(T t)而不是B::operator()()

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-02 23:24:36

我相信你是在找

代码语言:javascript
复制
decltype(std::declval<B>()(std::declval<A>())) c = b(a);

分解:

代码语言:javascript
复制
         std::declval<B>() //pretend there's a B object
                           std::declval<A>() //pretend there's an A object
         std::declval<B>()(std::declval<A>()) //call b(a) with these 
decltype(std::declval<B>()(std::declval<A>())) //tell me the return type

或者,如果你想掩盖这些细节:

代码语言:javascript
复制
template<typename T>
using B_return_t = decltype(std::declval<B>()(std::declval<T>()));


B_return_t<A> c = b(a);

http://coliru.stacked-crooked.com/a/4e6e235b47b12cdd

我想这不算:

代码语言:javascript
复制
auto c = b(a);
票数 3
EN

Stack Overflow用户

发布于 2021-06-02 22:41:42

无论a、b(a)的类型如何,

都应该返回一个double。我想用解密型从B之外推断出这一点。

你一般无法推断出第一句话。在C++中决定表达式的类型是图灵完整的;请参阅这个问题:

C++ templates Turing-complete?

如果您想要确定特定aa类型,只需编写:decltype(b(a));并且不管B类的operator()是否模板化。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67812318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档