【发布时间】:2012-05-14 12:40:08
【问题描述】:
我的应用程序中有一个问题,我想断言一个函数应用程序将被编译器拒绝。有没有办法通过 SFINAE 进行检查?
例如,假设我想验证 std::transform 到 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
【问题讨论】:
-
constexpr可能会有所帮助,只是快速思考一下。 -
另一个问题是
std::cout << sizeof(std::transform(iter1(), iter1(), iter2(), func()));可以编译,而std::cout << std::transform(iter1(), iter1(), iter2(), func());没有。 -
@Lol4t0 那是因为
sizeof()在编译期间不会评估它的参数。
标签: c++ sfinae typetraits c++-concepts