3 개의 정수 (또는 git / SVN commit / rev. string)에서 constexpr 버전 문자열을 생성하는 방법은 무엇입니까?

Rubenvb

내가 가지고 있다고

constexpr const std::uint8_t major = 1;
constexpr const std::uint8_t minor = 10;
constexpr const std::uint8_t bugfix = 0;

그리고 나는 원한다

constexpr const char* version_string(){ ... }

"1.10.0"이 예제에서에 해당하는 것을 반환하려면 어떻게해야합니까?

이 두 가지가 모두 필요하다고 가정합니다 constexpr.

  • 정수에서 문자열로 변환
  • 문자열 연결

문제는 순전히 학문적이며, constexpr"가능하다"는 것 외에는 실제로 사용하는 데 거의 쓸모가 없다고 생각합니다 . 나는 이것이 어떻게 풀릴 지 알 수 없다. GCC 4.9 및 Clang 3.4 / 3.5에서 작동하는 C ++ 1y 솔루션을 기꺼이 받아들입니다.

나는 일본 블로그에서 내가 찾는 것을 거의 발견했다고 믿는다.

나는 이것들로 무엇을 할 수 있는지 볼 것이고, 아마도 결과에 만족할 때 스스로 선언 한 흥미로운 질문에 답할 것입니다.

건설자

다음은 C ++ 11 솔루션입니다. char...매개 변수 팩 과 함께 클래스 템플릿을 사용 하여 문자열을 시뮬레이션합니다.

#include <iostream>
#include <type_traits>

template <char... symbols>
struct String
{
    static constexpr char value[] = {symbols...};
};

template <char... symbols>
constexpr char String<symbols...>::value[];

template <typename, typename>
struct Concat;

template <char... symbols1, char... symbols2>
struct Concat<String<symbols1...>, String<symbols2...>>
{
    using type = String<symbols1..., symbols2...>;
};

template <typename...>
struct Concatenate;

template <typename S, typename... Strings>
struct Concatenate<S, Strings...>
{
    using type = typename Concat<S, typename Concatenate<Strings...>::type>::type;
};

template <>
struct Concatenate<>
{
    using type = String<>;
};

template <std::size_t N>
struct NumberToString
{
    using type = typename Concat
        <
            typename std::conditional<(N >= 10), typename NumberToString<N / 10>::type, String<>>::type,
            String<'0' + N % 10>
        >::type;
};

template <>
struct NumberToString<0>
{
    using type = String<'0'>;
};

constexpr const std::uint8_t major = 1;
constexpr const std::uint8_t minor = 10;
constexpr const std::uint8_t bugfix = 0;

using VersionString = Concatenate
    <
        NumberToString<major>::type,
        String<'.'>,
        NumberToString<minor>::type,
        String<'.'>,
        NumberToString<bugfix>::type
    >::type;

constexpr const char* version_string = VersionString::value;

int main()
{
    std::cout << version_string << std::endl;
}

실제 예를 참조하십시오 .

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관