Как проверить во время компиляции, что выражение является недопустимым?

У меня есть проблема в моем приложении, где я хотел бы утверждать, что приложение-функция будет отклонено компилятором. Есть ли способ проверить это с помощью 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
12
задан TemplateRex 5 May 2012 в 18:34
поделиться