gpt4 book ai didi

c++ - 如何在编译时检查表达式是否非法?

转载 作者:IT老高 更新时间:2023-10-28 23:20:17 26 4
gpt4 key购买 nike

我的应用程序中有一个问题,我想断言一个函数应用程序将被编译器拒绝。有没有办法通过 SFINAE 进行检查?

例如,假设我想验证 std::transformconst 范围是非法的。到目前为止,这是我所拥有的:

#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 = detect if expression compiles .

该答案的

总结:sizeof 评估传递给它的表达式的类型,包括实例化函数模板,但它不会生成函数调用。这就是 Lol4t0 观察到 sizeof(std::transform(iter1(), iter1(), iter2(), func())) 编译的原因,即使 std::transform( iter1(), iter1(), iter2(), func()) 没有。

您的具体问题可以通过评估 Lol4t0 的答案中的模板来解决要提供给 std::transform 的任何输出范围。然而,使用 sizeof + SFINAE 技巧似乎无法解决在模板中验证函数调用是否会编译的一般问题。 (它需要一个可从运行时函数调用派生的编译时表达式)。

您不妨试试ConceptGCC看看这是否允许您以更方便的方式表达必要的编译时检查。

关于c++ - 如何在编译时检查表达式是否非法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10457804/

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