输入特征以检测可调用对象是否有副作用?
Type traits to detect if a callable has side effects?
我的问题问起来很简单,但我想,很难回答。
在 C++14 中,有没有办法测试可调用对象(函数、函数成员、lambda 函数、std::function 等...)是否有副作用?
如果是这样,a 类型特征如何:
template <class T>
struct has_side_effects;
会怎样?
我可以接受 return 假阳性的特征(说函数有副作用而实际上没有),但不接受 return 假阴性的特征(表示函数在执行时没有副作用)。
例如,我想要特征:
auto comparator = [](const auto& x, const auto& y){return y > x;};
bool result = std::has_side_effects<decltype(comparator)>::value;
到returnfalse
.
如前所述,template<class T> using has_side_effects = std::true_type;
可以解决您的大部分问题。简单地声明一切都有副作用,然后发布。误报,但没有漏报!
一般来说,无法计算在 Turing-complete 系统中编码的算法的 non-trivial 属性。这样做等同于停机问题。所以这个问题不能一概而论
在特定情况下,C++ 对算法内容的反映基本上为零。充其量它提供了对算法 接口 的一些反映,但是 algorithm/function 的接口不包含有关算法纯度的信息。
最接近的是 "can it be invoked within a constexpr
context"。
具体案例:
auto comparator = [](const auto& x, const auto& y){return y > x;};
bool result = std::has_side_effects<decltype(comparator)>::value;
结果必须是 true
,因为:
struct evil {
static int count() { static int r = 0; return ++r; }
friend bool operator<( evil lhs, evil rhs ) { count(); return false; }
};
然后comparator(evil{}, evil{})
有副作用。在通过 comparator
时使用 return false
是完全不正确的。
我的问题问起来很简单,但我想,很难回答。
在 C++14 中,有没有办法测试可调用对象(函数、函数成员、lambda 函数、std::function 等...)是否有副作用?
如果是这样,a 类型特征如何:
template <class T>
struct has_side_effects;
会怎样?
我可以接受 return 假阳性的特征(说函数有副作用而实际上没有),但不接受 return 假阴性的特征(表示函数在执行时没有副作用)。
例如,我想要特征:
auto comparator = [](const auto& x, const auto& y){return y > x;};
bool result = std::has_side_effects<decltype(comparator)>::value;
到returnfalse
.
如前所述,template<class T> using has_side_effects = std::true_type;
可以解决您的大部分问题。简单地声明一切都有副作用,然后发布。误报,但没有漏报!
一般来说,无法计算在 Turing-complete 系统中编码的算法的 non-trivial 属性。这样做等同于停机问题。所以这个问题不能一概而论
在特定情况下,C++ 对算法内容的反映基本上为零。充其量它提供了对算法 接口 的一些反映,但是 algorithm/function 的接口不包含有关算法纯度的信息。
最接近的是 "can it be invoked within a constexpr
context"。
具体案例:
auto comparator = [](const auto& x, const auto& y){return y > x;};
bool result = std::has_side_effects<decltype(comparator)>::value;
结果必须是 true
,因为:
struct evil {
static int count() { static int r = 0; return ++r; }
friend bool operator<( evil lhs, evil rhs ) { count(); return false; }
};
然后comparator(evil{}, evil{})
有副作用。在通过 comparator
时使用 return false
是完全不正确的。