4

この以前に回答された質問は、私が以下に投稿したコードが機能しない理由を説明しています。フォローアップの質問があります:概念的に同等の回避策がありますか?つまり、コンパイル時の文字列連結を実現しますが、実際には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(); }
4

2 に答える 2

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
}
于 2012-01-29T16:29:22.270 に答える
3

SproutC++ライブラリはconstexpr文字列を提供します。参照: https ://github.com/bolero-MURAKAMI/Sprout/blob/master/libs/string/test/string.cpp

于 2012-01-31T02:24:48.093 に答える