模板创建字符串文字

时间:2019-01-01 12:40:23

标签: c++ templates visual-c++ string-literals

我有一个C ++类,可以在charwchar_t上进行模板化。我需要将此类的实例与一些预定义的默认对象进行比较。因此,我想使用std::array。该类的构造函数采用一个std::basic_string<CT>变量(尽管我可以根据需要随意更改)。

因此,在预定义数组中,我需要提供字符串文字以满足该参数。我想避免重复自己,所以我也想模板std::array

是否可以以某种方式对字符串文字进行模板化,使其类型为char*wchar_t*?这些字符串将仅包含ASCII字符,因此可以用char和wchar_t字符表示。

我自己做了几次尝试,包括尝试对类似于these的文字运算符进行模板化,并尝试使用constexpr模板化函数。


编辑:根据要求,这是我的尝试之一。

#include <array>

template <typename CT, size_t N>
constexpr const CT* const str(const char(&s)[N]);

template <size_t N>
constexpr const char* const str(const char(&s)[N])
{
    return s;
}

template <size_t N>
constexpr const wchar_t* const str(const char(&s)[N])
{
    // What to do here to convert s to a wchar_t*?
    return nullptr;
}

template <typename CT>
class OuterClass
{
public:
    OuterClass(const CT* string) {}

    static inline std::array<OuterClass, 1> Predefined = {
        {
            { str<CT>("String") }
        }
    };
};

int main()
{
    const OuterClass<char>& o1 = OuterClass<char>::Predefined[0];
    const OuterClass<wchar_t>& o2 = OuterClass<wchar_t>::Predefined[0];
}

然后我想也许可以在L""重载的wchar_t函数中利用str()运算符,但是我无法确定如何调用该运算符。

我还认为也许我可以使用std::basic_string<CT>作为返回类型,并使用一些C ++函数将char字符串转换为wchar_t字符串,但是C ++编译器没有允许constexpr函数返回std::basic_string<CT>

0 个答案:

没有答案