如何为任何给定 C++ lambda 的每个数据成员调用
static_assert
?
我想做的是推出我自己的 memcpy 功能
std::function
并意识到任何 lambda 都必须具有可简单复制的数据成员。我想为此提出一些断言。
示例:
template<typename T> struct has_trivial_copy {enum {value = false};};
template<> struct has_trivial_copy<int> {enum {value = true};};
int main() {
int i = 0;
std::string str;
auto lambda1 = [i] {
// static_assert(has_trivial_copy<each data member...>::value); // okay
};
auto lambda2 = [i, str] {
// static_assert(has_trivial_copy<each data member...>::value); // fail
};
}
虽然不可能为 lambda 的每个成员调用
static_assert
,但可以在任何给定的 lambda 上使用 std::is_trivially_copyable
来断言它是可简单复制的。
我已将以下
static_assert
添加到我的自定义 std::function
中,它可以很好地向我展示我在 lambda 中使用非平凡可复制数据成员的所有位置:
template <typename Functor, typename ReturnType, typename... Args>
struct FunctorHolder
{
FunctorHolder (Functor func) : f (func)
{
static_assert(std::is_trivially_copyable<Functor>::value);
}
Functor f;
};