2016-12-03 9 views
2

나는 문자열을 포맷하는 기능을 가지고 :C++ 형식의 문자열

template<typename ... Args> 
inline std::string format(const std::string & format, Args ... args) 
{ 
    std::size_t size = MINIGINE_FORMAT_PRINTF(nullptr, 0, format.c_str(), args ...) + 1; // +1 for NULL terminated 
    std::unique_ptr<char[]> buf(new char[ size ]); 
    MINIGINE_FORMAT_PRINTF(buf.get(), size, format.c_str(), args ...); 
    return std::string(buf.get(), buf.get() + size - 1); // -1 we don't want NULL terminated 
} 

문제는 그 나는이 함수를 호출 할 때

format("%d", ""); 

경고가의 템플릿 기능에없는 표시됩니다 전화 사이트에서.

템플릿 기능이 아닌 통화 사이트에서 형식 경고를 표시 할 수 있습니까?

+1

을 둘 다 동일한 코드를 생성 듯 https://godbolt.org/ 와 당신의 코드는 '경고가 템플릿 사이트에 표시되고 호출 사이트에는 표시되지 않습니다.'라는 의미를 밝히지 않습니다. [mcve]가 필요했습니다. –

+0

sprintf를 호출 할 때 포맷 함수 내에 경고가 생성됩니다. 호출 기능 - 형식 함수를 호출 할 때 오류가 호출 사이트에 표시되어야합니다. format() 함수 내부에 경고 메시지가 표시되고 함수 호출자가 100 명인 경우 오류가 발생한 위치를 추적하기가 매우 어렵습니다. –

답변

0

나는 내 문제를 해결하는 해결책을 찾았다. 컴파일러가 형식에 대한 경고를 생성하면 매크로가 호출되는 줄에 경고가 표시됩니다.

나는 템플릿 형식 기능과에서 아래의 매크로를 모두 테스트 한

: 대신에 표준의 * 함수의 형식 인수가 const를 숯불 템플릿 때 : 문자열을

#pragma once 

#include <string> 
#include <memory> 

#ifdef _MSC_VER 
    #define MINIGINE_FORMAT_PRINTF _snprintf 
#else 
    #define MINIGINE_FORMAT_PRINTF snprintf 
#endif 

#define MINIGINE_FORMAT(format, ...) \ 
/*Capture everything by reference*/[&] /*No arguments*/() \ 
{ \ 
    std::size_t size = MINIGINE_FORMAT_PRINTF(nullptr, 0, format, __VA_ARGS__) + 1; \ 
    std::unique_ptr<char[]> buf(new char[ size ]); \ 
    MINIGINE_FORMAT_PRINTF(buf.get(), size, format, __VA_ARGS__); \ 
    return std::string(buf.get(), buf.get() + size - 1); \ 
} /*Call the lambda*/() 
+0

C++에서 매크로로 메타 프로그래밍 하시겠습니까? 그게 확실한가요? –

+0

다른 해결책이 있습니까? –

+0

귀하의 질문에 대한 자세한 내용은 약간 미안합니다. 그러나 나는 정말로 그것을 얻지 못합니다. 정말로 당신이 검색 한 대답이라면 왜 받아들이지 않는 것입니까? 그렇지 않은 경우 소식을 수정하지 않으시겠습니까? –