使用/解决模板时停止编译

Stop compilation when a template has been used/resolved

本文关键字:编译 解决 使用      更新时间:2023-10-16

这个mcve:

#include <stdio.h>
#include <time.h>
#define MAX_LENGTH_DATETIME 25
template <typename T>
char * convertUnixTimeToChar( time_t unixTime, T )
{
    (void) unixTime;
    #pragma message "2nd parameter in convertUnixTimeToChar() must be of type <char [MAX_LENGTH_DATETIME]>."
    exit(1);
};
template<size_t N>
char * convertUnixTimeToChar( time_t unixTime, char (&destination) [N] )
{
    if ( N < MAX_LENGTH_DATETIME )
    {
        printf( "Overflow in convertUnixTimeToChar(): destination size [%ld] must be at least [%u]", N, MAX_LENGTH_DATETIME );
        exit(1);
    }
    struct tm * tmNow;
    tmNow = localtime( &unixTime );
    strftime( destination, MAX_LENGTH_DATETIME - 1, "%Y-%m-%d %H:%M:%S", tmNow );
    return destination;
};
int main()
{
    char buffer [MAX_LENGTH_DATETIME ];
    printf( "Converted unix time=%sn", convertUnixTimeToChar( 1487585045, buffer ) );
}

我的问题:

我想从 gcc中显示消息#pragma message "2nd parameter in convertUnixTimeToChar() must be of type <char [MAX_LENGTH_DATETIME]>." ,而仅在 char *的变量已传递给convertUnixTimeToChar()时,汇编才能显示。现在我总是收到此消息。

换句话说,如果传递错误的参数,而不是程序运行时,则该汇编应失败[在这种情况下,我必须使用printf而不是#pragma才能获得通知]。

传递诸如char [25]之类的东西可以解决第二模板,一切都很好!

如果使用模板已使用,我可以通过有条件地停止使用错误消息的汇编?

使用这些开关使用GCC 4.9.4编译:-Wall -Werror -Wextra -std=c++11 -O3

再次,最佳解决方案是"完全不要做任何事情"。
完全删除全部超负荷将使编译器为任何无法匹配char (&destination) [N]的参数产生错误。

如果您想幻想并添加自己的错误消息,则可以在catch-all内使用依赖的 static_assert

template <class..., class T>
constexpr T &&depend(T &&o) {
    return std::forward<T>(o);
}
template <typename T>
char *convertUnixTimeToChar( time_t, T&& )
{
    static_assert(depend<T>(false), "2nd parameter in convertUnixTimeToChar() must ...");
}

并不是说这可能不是更好的解决方案,因为您将整个过载设置为convertUnixTimeToChar并将其沉入硬错误,Sfinae会被诅咒。如果某人想为自己的类型添加过载,他们将必须确保比这种爆炸性的全部匹配更好,这比获得者更痛苦。