可以返回void或非void值的模板函子包装
Template functor wrapper that can return a void or non-void value
如何从模板函子包装器返回任意类型(void或非void)?我将包装器用于前置和后置条件,因此在从包装器返回值之前,我需要将返回的值存储在本地变量中。但是,当返回的类型为void时,编译器会给出并出错,因为变量不能具有void类型。这里能做什么?
template <typename Functor, typename... Args>
auto Decorate(Functor f, Args&&... args)
-> decltype(f(std::forward<Args>(args)...)) {
// preconditions
const auto result = f(std::forward<Args>(args)...);
// postconditions
return result;
}
在合适类的构造函数/析构函数中运行预条件和后条件,并直接返回值!只要你不需要在你的帖子条件下触摸返回值,这应该不是问题!
struct condition
{
condition() { /* do pre-condition checks */ }
~condition() { /* do post-condition checks */ }
condition(condition&) = delete;
void operator= (condition&) = delete;
};
template <typename Functor, typename... Args>
auto Decorate(Functor f, Args&&... args)
-> decltype(f(std::forward<Args>(args)...)) {
condition checker;
return f(std::forward<Args>(args)...);
}
使用sfinae:
#include <type_traits>
template <typename Functor, typename... Args>
auto Decorate(Functor f, Args&&... args)
-> typename std::enable_if<std::is_same<decltype(f(std::forward<Args>(args)...)), void>::value, void>::type
{
// preconditions
f(std::forward<Args>(args)...);
// postconditions
return;
}
template <typename Functor, typename... Args>
auto Decorate(Functor f, Args&&... args)
-> typename std::enable_if<!std::is_same<decltype(f(std::forward<Args>(args)...)), void>::value, decltype(f(std::forward<Args>(args)...))>::type
{
// preconditions
auto result = f(std::forward<Args>(args)...);
// postconditions
return result;
}
测试:
void f(int x) {
std::cout << "f(" << x << ")" << std::endl;
return;
}
int g(int x) {
std::cout << "g(" << x << ")" << std::endl;
return x * x;
}
int main()
{
Decorate(f, 3);
std::cout << Decorate(g, 3);
return 0;
}
f(3)
g(3)
9
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 在c++类上调用void函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 如何在c++17中制作一个模板包装器/装饰器
- 在派生函数中指定void*参数
- C++为什么尽管我调用了void函数,它却不起作用
- 如何从void函数输出字符串
- 我应该使用什么来代替void作为变体中的替代类型之一
- std::vector的包装器,使数组的结构看起来像结构的数组
- 奇怪的结构&GCC&clang(void*返回类型)
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 处理模板函数包装中的void返回
- 用 pybind11 包装C++ void 函数
- 包装在 do-while-0 中与包装在带有 (void)0 的三元运算符中
- JNI -> 如何包装 c++ void*
- 使用SWIG,如何将C++void func(Class&out)包装为C#类func()?
- OpenCL enqueueWriteImage no const void* ptr 在包装器中C++但在 C 函数中
- 可以返回void或非void值的模板函子包装
- 带参数的非Void函数的Void包装