constexpr与字符串操作解决方法?

and*_*gan 4 c++ stdstring constexpr c++11

这个以前回答问题,解释了为什么我已张贴下面的代码不起作用.我有一个后续问题:是否存在概念上等效的解决方法,即实现编译时字符串连接,但是以C++ 11实际支持的方式实现?使用std :: string是完全不必要的.

constexpr std::string foo() { return std::string("foo"); }
constexpr std::string bar() { return std::string("bar"); }
constexpr std::string foobar() { return foo() + bar(); }
Run Code Online (Sandbox Code Playgroud)

Den*_*hin 7

编译时"字符串"连接:

#include <iostream>
#include <string>

template <char ... CTail>
struct MetaString
{ 
    static std::string string()
    {
        return std::string{CTail...};
    }
};

template <class L, class R>
struct Concatenate;

template <char ... LC, char  ... RC>
struct Concatenate<MetaString<LC ... >, MetaString<RC ... >>
{
    typedef MetaString<LC ..., RC ... > Result;
};

int main()
{
    typedef MetaString<'f', 'o', 'o'> Foo;
    typedef MetaString<'b', 'a', 'r'> Bar;

    typedef typename Concatenate<Foo, Bar>::Result FooBar;

    std::cout << Foo::string() << std::endl; //  foo
    std::cout << Bar::string() << std::endl; //  bar
    std::cout << FooBar::string() << std::endl; //  foobar
}
Run Code Online (Sandbox Code Playgroud)

  • @DeadMG:如果可以推导出(函数模板)/在部分特化中使用,则可以有多个.或者换句话说,如果包装本身不是顶级的. (4认同)