Я пытаюсь упростить проверку во время компиляции, сохраняет ли значение преобразование одного значения в новый тип. В STL может быть что-то, что может сделать это для меня, но я этого не вижу, поэтому написал. Это работает, но я хотел преобразовать его в класс, чтобы сделать его использование немного проще для других. Я не могу заставить это работать, и я чувствую, что упускаю что-то очевидное.
Это отлично работает:
template <typename T, typename Q>
constexpr bool checkV(const Q x)
{return x == (T)x && ((x < 0) == ((T)x < 0));}
static_assert(checkV<unsigned int>(-7), "No");
Но звонок неуклюжий, поэтому хотелось чего-то более похожего на
CheckIt<unsigned int>(-7)
и поэтому я попытался
template<typename T>
class CheckIt {public:
template<typename Q>
constexpr CheckIt(const Q x) {static_assert(checkV<T>(x), "No");}
};
Я пробовал различные комбинации const и constexpr (и обнаруженные параметры не могут быть constexprs, что раздражает). Все, что я пробую, приводит к тому, что g++ жалуется, что x не является постоянным выражением в конструкторе.
Что мне не хватает? checkv и конструктор всегда вызываются с константами, например -7. checkv() с удовольствием оценивает во время компиляции, и я не вижу, где использование функции конструктора для переноса добавляет какую-либо дополнительную нагрузку на компилятор, но, очевидно, это так. Примечание. Мне нужно, чтобы это работало в С++ 11, но я не вижу, где помогут более поздние версии. У меня нет проблем с проверкой во время выполнения с помощью assert, но мне нужно решение для времени компиляции для констант. ТИА.
x
должен быть параметром шаблона. - person HolyBlackCat   schedule 04.11.2019static_assert(checkV<unsigned int>(-7), "No");
была бы единственным вариантом для С++ 11. - person user7860670   schedule 04.11.2019I want the compile time solution for constants
— значит, вы хотите определить, является ли параметр константой, а затем использоватьstatic_assert
? Если он должен быть только постоянным, используйте шаблоны. - person KamilCuk   schedule 04.11.2019checkV
все круглые скобки, кроме тех, что в двух приведениях, избыточны. - person Pete Becker   schedule 04.11.2019x
в качестве параметра функции никогда не сработает, так как это переменная, а не константное выражение. - person JHBonarius   schedule 04.11.2019assert
для проверки во время выполнения. - person Thomas   schedule 04.11.2019