내가 가지고 있다고
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] 삭제
몇 마디 만하겠습니다