C++ 17:从模板中的 Callable 推导出签名
C++ 17: Deduce signature from Callable in a template
是否以及如何从 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 class 模板参数推导。
在客户端代码中,我想这样写:
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++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 class 模板参数推导。
在客户端代码中,我想这样写:
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;});
}