gpt4 book ai didi

C++验证模板类型的可调用签名

转载 作者:太空狗 更新时间:2023-10-29 22:59:01 25 4
gpt4 key购买 nike

假设我有一个像这样的通用函数:

template<typename TFunc>
void templFunc(TFunc func) {
func(3, 6);
}

有什么方法可以在编译时验证 TFunc 的签名,无论它是 std::function 还是 lambda 或任何类型的函数引用。我只想确保 TFunc 的签名为 void(int, int) 或与 static_assert 类似,这样我就可以生成非垃圾错误消息。

最佳答案

所以我摆弄了一些 type_traits 的东西,我想我有一些东西可以验证整个签名,而不仅仅是返回值,并且允许你创建易于阅读的 static_asserts 而不是签名不正确时难以辨认的模板错误'匹配。这是一个糟糕的解决方案吗?

#include <functional>

template<typename, typename, typename = void>
struct is_signature : std::false_type {};

template<typename TFunc, typename Ret, typename... Args>
struct is_signature<TFunc, Ret(Args...),
typename std::enable_if<
std::is_convertible<
TFunc,
std::function<Ret(Args...)>
>::value
>::type
> : public std::true_type
{};

// works on both functions and lambda's
void blah(int, int) {
}

template<typename TFunc>
void templFunc(TFunc func) {
static_assert(is_signature<TFunc, void(int, int)>::value, "Not gonna work! more info follows:");
func(3, 6);
}

int main() {
auto b = [](int, int) -> void {
};

auto c = [](int) -> void {
};

static_assert(is_signature<decltype(b), void(int, int)>::value, "b convertible to a std::function<void(int, int), so this checks out!");
static_assert(is_signature<decltype(b), void(int)>::value, "b not convertible to a std::function<void(int)>, so this will error in compilation.");
static_assert(is_signature<decltype(blah), void(int, int)>::value, "blah convertible to a std::function<void(int, int), so this checks out!");
static_assert(is_signature<decltype(blah), void(int)>::value, "blah not convertible to a std::function<void(int)>, so this will error in compilation.");

templFunc(b); // <- ok
templFunc(c); // <- static assertion : not gonna work!
return 0;
}

关于C++验证模板类型的可调用签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38067106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com