Mam problem w mojej aplikacji, w którym chciałbym potwierdzić, że aplikacja funkcji zostanie odrzucona przez kompilator. Czy można to sprawdzić za pomocą SFINAE?Jak sprawdzić podczas kompilacji, czy wyrażenie jest niedozwolone?
Załóżmy na przykład, że chciałbym sprawdzić, czy zakres std::transform
dla zakresu jest niedozwolony. Oto, co mam do tej pory:
#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;
}
Niestety, moja cecha odrzuca zarówno sprawy prawne, jak i nielegalne. Rezultat:
$ g++ valid_transform.cpp
$ ./a.out
valid transform compiles: 0
invalid transform compiles: 0
'constexpr' może pomóc, tylko szybki myśl. – chris
Innym problemem jest to, że 'std :: cout << sizeof (std :: transform (iter1(), iter1(), iter2(), func()));' kompiluje, podczas gdy 'std :: cout << std :: transform (iter1(), iter1(), iter2(), func()); 'does not. – Lol4t0
@ Lol4t0 To dlatego, że 'sizeof()' nie analizuje argumentów podczas kompilacji. – TemplateRex