c++ - C++ 17:从模板中的Callable推导签名

标签 c++ c++17 signature callable template-argument-deduction

是否可以从C++ 17中的任何可调用方式推导出签名类型?
片段:

template <typename T>
struct MyFunction;

template <typename R, typename... Args>
struct MyFunction<R(Args...)>
{
};

template <typename Callable>
auto deduceSignature(Callable&& c)
{
    // using Signature = ???;
    // return MyFunction<Signature>{ ???};}
}
我想在return语句中使用use类模板参数推论。
在客户端代码中,我想这样写:
std::int8_t freeFunction(std::int8_t x)
{
    return x;
}

auto c1 = deduceSignature(&freeFunction);
auto c2 = deduceSignature([](std::int8_t x){
    return x;
});

最佳答案

std::function可以从任何可调用对象构造,并且可以推断出签名(自c++ 17起)。我们可以使用它来创建提取签名的类型特征。

#include <functional>

template <typename T>
struct get_signature;

template <typename R, typename... Args>
struct get_signature<std::function<R(Args...)>> {
    using type = R(Args...);
};

template <typename Callable>
auto deduceSignature(Callable&& c)
{
    using Signature = typename get_signature<decltype(std::function{c})>::type;
}

int main() {
    deduceSignature([](int a){return 5;});
}

关于c++ - C++ 17:从模板中的Callable推导签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65033687/

相关文章:

c++ - 合并排序算法无法正常工作

c++ - ifstream seekg 有什么问题

c++ - 原始 static_vector 实现中可能未定义的行为

c++ - 声明在早期友元定义中定义的友元函数

soap - 在 Apache JMeter 的 SOAP 请求中添加签名

saml - 在 SAML 响应中,我们应该签署响应还是断言

c++ - OpenSSL/c/c++ - EC secp256k1 key 生成

c++ - 括号内声明对象的范围

c++ - 不同计算机上的时钟时序变化

android - 我无法将 Android 项目从 Delphi 10.4 迁移到 Delphi 11.1