2012-01-29 23 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

所以你想要编译时字符串连接? – 2012-01-29 04:23:01

回答

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

这实际上是否正常工作?我以为你只能有一个可变数据包。 – Puppy 2012-01-30 18:46:31

+4

@DeadMG:如果可以推导出(函数模板)/用于部分专业化,则可以有多个。换句话说,如果包本身不是顶级的。 – Xeo 2012-01-31 03:23:13