A small header only utility library adding traits for function types in C++.
Add the CMakeLists.txt to your project via add_subdirectory and then include the header in your source files:
(Or add the header directly to your project.)
cmake_minimum_required(VERSION3.16) # or higheradd_subdirectory(traits)Then in your source files, you can include the header like this:
#include<traits/functions.hpp>#include<traits/functions.hpp>// All of these can be inspected:auto lambda = [](int x) { return x * 2; };
structFunctionObject {
intoperator()(double x) const {
returnstatic_cast<int>(x);
}
std::string memberFunction(double x) const& {
returnstd::to_string(x);
}
};
doublefreeFunction(double x) {
return x * 2.0;
}
intmain() {
usingnamespaceTraits;// Example of using FunctionTraits with a lambdaauto lambda = [](std::string const& x, std::size_t y) noexcept { return x.size() + y; };
using LambdaTraits = FunctionTraits<decltype(lambda)>;
static_assert(LambdaTraits::arity == 2, "Lambda should have arity 1");
static_assert(std::is_same_v<LambdaTraits::ReturnType, std::size_t>, "Lambda should return int");
static_assert(std::is_same_v<LambdaTraits::Argument<0>, std::string const&>, "Lambda should take int as argument");
static_assert(std::is_same_v<LambdaTraits::Argument<1>, std::size_t>, "Lambda should take size_t as argument");
static_assert(
std::is_same_v<LambdaTraits::ArgumentDecayed<0>, std::string>, "Lambda should take size_t as argument");
static_assert(std::is_same_v<LambdaTraits::ArgsTuple, std::tuple<std::string const&, std::size_t>>);
static_assert(std::is_same_v<LambdaTraits::ArgsTupleDecayed, std::tuple<std::string, std::size_t>>);
static_assert(LambdaTraits::qualifiers.isConst, "Lambda is not mutable");
static_assert(!LambdaTraits::qualifiers.isVolatile, "Lambda is not volatile");
static_assert(LambdaTraits::qualifiers.isNoexcept, "Lambda is noexcept");
static_assert(!LambdaTraits::qualifiers.isReferenceQualified, "Lambda is not reference qualified");
static_assert(!LambdaTraits::qualifiers.isRvalueReferenceQualified, "Lambda is not rvalue reference qualified");
static_assert(
std::is_same_v<LambdaTraits::StandardFunctionType, std::function<std::size_t(std::string const&, std::size_t)>>,
"Standard function type should match");
static_assert(
std::is_same_v<LambdaTraits::StandardFunctionTypeDecayed, std::function<std::size_t(std::string, std::size_t)>>,
"Standard function type decayed should match");
return0;
}