预处理程序命令中的sizeof不会编译,错误为C1017

Zha*_*ang -4 c++ preprocessor-directive

我想使用预处理器命令来控制代码执行路径。因为这样可以节省运行时间。

#if (sizeof(T)==1 不符合错误:C1017

template<typename T>
    class String
    {
    public:
        static void showSize()
        {
#if (sizeof(T)==1) 
            cout << "char\n";
#else
            cout << "wchar_t\n";
#endif
        }
    };

    inline void test()
    {
        String<char>::showSize();
        String<wchar_t>::showSize();
    }
Run Code Online (Sandbox Code Playgroud)

Mil*_*nek 7

预处理程序在C ++编译器之前运行。它对C ++类型一无所知。仅预处理器令牌。

虽然我希望任何不错的编译器都能优化an if (sizeof(T) == 1),但您可以在C ++ 17中使用新的代码明确地指出这一点if constexpr

template<typename T>
class String
{
public:
    static void showSize()
    {
        if constexpr (sizeof(T) == 1) {
            std::cout << "char\n";
        } else {
            std::cout << "wchar_t\n";
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

现场演示

在C ++ 17之前,它不那么直接。您可以使用一些部分专业化的恶作剧。它不是特别漂亮,在这种情况下,我认为它甚至不会更加高效,但是在其他情况下也可以使用相同的模式:

template <typename T, size_t = sizeof(T)>
struct size_shower
{
    static void showSize()
    {
        std::cout << "wchar_t\n";
    }
};

template <typename T>
struct size_shower<T, 1>
{
    static void showSize()
    {
        std::cout << "char\n";
    }
};

template<typename T>
class String
{
public:
    static void showSize()
    {
        size_shower<T>::showSize();
    }
};
Run Code Online (Sandbox Code Playgroud)

现场演示

在这种情况下,您可以直接进行专长研究String,但是我假设在您的实际情况下,它有其他成员您不想重复。