2012-01-29 15 views
4

このpreviously answered questionは、以下に掲載したコードがなぜ機能しないのかを説明しています。私はフォローアップの質問があります:概念的に等価な回避策がありますか?つまり、コンパイル時の文字列連結を実現しますが、C++ 11で実際にサポートされている方法で実装されていますか? std :: stringの使用は完全に必須ではありません。文字列操作でconstexpr回避策?

constexpr std::string foo() { return std::string("foo"); } 
constexpr std::string bar() { return std::string("bar"); } 
constexpr std::string foobar() { return foo() + bar(); } 
+1

コンパイル時の文字列連結が必要ですか? –

答えて

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 
} 
+1

実際に動作する予定ですか?私はあなたが1つのvariadicパックしか持てないと思った。 – Puppy

+4

@DeadMG:演繹できる(関数テンプレート)/部分的な特殊化で使用されている場合は、複数を持つことができます。または、言い換えれば、パック自体がトップレベルでない場合。 – Xeo