Tengo un problema en mi aplicación en el que me gustaría afirmar que el compilador rechazará una aplicación de función. ¿Hay alguna manera de verificar esto con SFINAE?¿Cómo comprobar en tiempo de compilación que una expresión es ilegal?
Por ejemplo, supongamos que me gustaría validar que std::transform
a un rango const
es ilegal. Esto es lo que tengo hasta ahora:
#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;
}
Lamentablemente, mi rasgo rechaza tanto los casos legales como los ilegales. El resultado:
$ g++ valid_transform.cpp
$ ./a.out
valid transform compiles: 0
invalid transform compiles: 0
'constexpr' podría ayudar, sólo un pensamiento rápido. – chris
El otro problema es que 'std :: cout << sizeof (std :: transform (iter1(), iter1(), iter2(), func()));' compila, mientras que 'std :: cout << std :: transform (iter1(), iter1(), iter2(), func()); 'no. – Lol4t0
@ Lol4t0 Eso es porque 'sizeof()' no evalúa sus argumentos durante el tiempo de compilación. – TemplateRex