我有一个类B,它接受一个模板参数,比如A。我创建一个B b并调用B::operator()(A a)。不管a的类型如何,b(a)都应该返回一个double。我想用从 B外部推导出这个decltype。
如果我有一个函数B::operator()(),我可以用
std::declval<B&>()()这是在我的另一个问题here中向我提出的。(请注意,这个问题中的A和B与上一个问题中的A和B不匹配。)
如果我有一个函数B::operator()(int i) (没有模板),我可以用
std::declval<B>()(int())虽然这似乎只起作用,因为int是默认的可构造的。
当B::operator()()是一个模板函数时,我该如何做呢?
下面是一些在我的机器上编译的启动代码。你不应该为了理解这个问题而去看它。
#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;
}编辑:
为了澄清,我想添加如下一行
using custom_typename = double;对于上面的代码,除了double之外,我编写了如下内容
using custom_typename = decltype(std::declval<B>()());适当地修改以接受返回类型的B::operator()(T t)而不是B::operator()()。
发布于 2021-06-02 23:24:36
我相信你是在找
decltype(std::declval<B>()(std::declval<A>())) c = b(a);分解:
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或者,如果你想掩盖这些细节:
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
我想这不算:
auto c = b(a);发布于 2021-06-02 22:41:42
无论a、b(a)的类型如何,
都应该返回一个double。我想用解密型从B之外推断出这一点。
你一般无法推断出第一句话。在C++中决定表达式的类型是图灵完整的;请参阅这个问题:
C++ templates Turing-complete?
如果您想要确定特定a的a类型,只需编写:decltype(b(a));并且不管B类的operator()是否模板化。
https://stackoverflow.com/questions/67812318
复制相似问题