我的应用程序遇到问题,我想断言函数应用程序将被编译器拒绝。有没有办法通过 SFINAE 检查这一点?
例如,假设我想验证std::transform
to a const
范围非法。这是我到目前为止所拥有的:
#include <algorithm>
#include <functional>
#include <iostream>
namespace ns
{
using std::transform;
template<typename Iterator1, typename Iterator2, typename UnaryFunction>
struct valid_transform
{
static Iterator1 first1, last1;
static Iterator2 first2;
static UnaryFunction f;
typedef Iterator2 yes_type;
typedef struct {yes_type array[2];} no_type;
static no_type transform(...);
static bool const value = sizeof(transform(first1, last1, first2, f)) == sizeof(yes_type);
};
}
int main()
{
typedef int *iter1;
typedef const int *iter2;
typedef std::negate<int> func;
std::cout << "valid transform compiles: " << ns::valid_transform<iter1,iter1,func>::value << std::endl;
std::cout << "invalid transform compiles: " << ns::valid_transform<iter1,iter2,func>::value << std::endl;
return 0;
}
不幸的是,我的特质既拒绝合法案件,也拒绝非法案件。结果:
$ g++ valid_transform.cpp
$ ./a.out
valid transform compiles: 0
invalid transform compiles: 0
你的问题类似于SFINAE + sizeof = 检测表达式是否编译 https://stackoverflow.com/questions/2127693/sfinae-sizeof-detect-if-expression-compiles.
Summary该答案:sizeof
计算传递给它的表达式的类型,包括实例化函数模板,但它不生成函数调用。这就是 Lol4t0 的观察背后的原因sizeof(std::transform(iter1(), iter1(), iter2(), func()))
即使std::transform(iter1(), iter1(), iter2(), func())
才不是。
您的具体问题可以通过评估 Lol4t0 答案中的模板来解决,以获取要提供给的任何输出范围std::transform
。然而,在模板中验证函数调用是否会编译的一般问题似乎无法通过sizeof + SFINAE
诡计。 (它需要一个可从运行时函数调用派生的编译时表达式)。
你可能想尝试概念海湾合作委员会 http://www.generic-programming.org/software/ConceptGCC/看看这是否允许您以更方便的方式表达必要的编译时检查。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)