std :: отмывание альтернативы pre c ++ 17

Если вы конвертируете строку, которую вы тестируете в нижний регистр, а также строку, которую вы тестируете, в нижний регистр, тогда случай больше не рассматривается!

Есть функции, которые могут сделать это для вас , но логика, стоящая за ними, всегда одна и та же ... Для сравнения без использования каких-либо данных требуется, чтобы оба фрагмента данных были преобразованы либо в любой строчный регистр (или в верхний регистр), прежде чем было проведено сравнение. I

10
задан balki 19 January 2019 в 00:36
поделиться

1 ответ

Нет, вы не можете. Одна из причин, по которой предлагается std::launder, заключается в том, что std::optional не реализуемо в C ++ 14. Вы можете обратиться к этому обсуждению для деталей.

С другой стороны, вы можете реализовать один без constexpr. Идея состоит в том, чтобы использовать буфер с reinterpret_cast, потому что результат reinterpret_cast всегда будет ссылаться на вновь созданный объект (в C ++ 17 std::launder все еще требуется, но в C ++ 14 это нормально). Например,

template<class T>
struct FakeOptional { 
    FakeOptional(){}  
    template<class... Args>
    void emplace(Args&&... args){
        new(&storage) T{std::forward<Args&&>(args)...};
    }
    void reset(){
        reinterpret_cast<T*>(&storage)->~T();
    }
    operator bool() const {
        return true;
    }
    const T* operator->() const {
        return reinterpret_cast<const T*>(&storage);
    }
    T* operator->() {
        return reinterpret_cast<T*>(&storage);
    }
    std::aligned_storage_t<sizeof(T), alignof(T)> storage;
};

Реализация boost::optional использует эту идею и не реализует constexpr семантику (вы можете обратиться к его исходному коду для подробности).

0
ответ дан alfC 19 January 2019 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: