Как создать запасной вариант, если недопустимый тип для аккумулятора наддува? - PullRequest
1 голос
/ 28 апреля 2019

Я пытаюсь написать функцию, которая позволяет применять различные объекты-накопители Boost к различным векторам разных типов.

Для некоторых типов объекты-аккумуляторы не имеют смысла. Например, большинство аккумуляторов не будет работать, если передан массив типов bool.

Упрощенный код у меня выглядит так:

#include <boost/accumulators/accumulators.hpp>
#include <boost/accumulators/statistics/count.hpp>

using namespace boost::accumulators;

template<class V, class T> static void _apply(T* ptr, size_t n) {
  accumulator_set<T, features<V> > acc;
  std::for_each(ptr, ptr + n, std::ref(acc));
};

int main() {
  bool v[] = { true, false, true };
  _apply<tag::count, bool>(v, 3);
}

Я пытаюсь выяснить, как использовать SFINAE для предоставления сообщения об ошибке во время выполнения _apply вызывается с типом, который не имеет смысла, а не с ошибкой компилятора.

error: no match for ‘operator+=’ (operand types are ‘const std::_Bit_reference’ and ‘const bool’)

1 Ответ

0 голосов
/ 28 апреля 2019

Вы, вероятно, ищете специализацию шаблона. Что-то вроде этого:

namespace internal {
template<typename V, typename T>
struct ApplyHelper {
  static void apply(T* ptr, size_t n) { /* general implementation here */ }
};

template<typename V>
struct ApplyHelper<V, bool> {
  static void apply(bool* ptr, size_t n) { /* report error here */ }
};
}

template<typename V, typename T>
static void _apply(T* ptr, size_t n) {
  internal::ApplyHelper<V, T>::apply(ptr, n);
};
...