0

我完成了必须以 C# 样式进行打印的任务

tprintf("{} world{} {} {} {}\n","Hello",'!',123," Je", "end");

代码如下

void tprintf(const char* format) // base function
{
    std::cout << format;
}

template<typename T, typename... Targs>
void tprintf(const char* format, T value, Targs... Fargs)
{
    for ( ; *format != '\0'; format++ ) {
           if(*format == '{'){
                if(format[1] == '}'){
           std::cout << value;
           tprintf(format+2, Fargs...); // recursive call
           return;
           }
        }
        std::cout << *format;
    }
}

现在我必须做一些不同的事情:

tprintf("{1} {3} + {2} = {4} {1}.", "11", 7.5 , 4, 11.5);

输出:

11 4 + 7.5 = 11.5 11。

所以我认为这里对 args 进行简单的递归迭代是行不通的。我必须知道所有起作用的参数。我认为我应该做的是开始将所有参数放入数组中,然后将它们输入到模式字符串中的正确位置。但是怎么做?

我做的

template<typename... Args> inline string pass(Args&&...) {return "End";}

template<typename T>
string some_function(T a){
    std::ostringstream ostr;
    ostr << a;
    //cout<<ostr.str();
    return ostr.str();
}

  template<typename... Args> inline void expand(Args&&... args) {
    string a="";
        
    a.append(pass( some_function(args)... ))<<endl;

    cout<<" result "<<a<<endl;
  }

struct pass {
    template<typename ...T> pass(T...) {}
  };

但这只会返回“结束”。我意识到这种行为的原因与哪个模板行为和递归有关。在递归中调用的最后一个想法是 template<typename...Args> inline string pass(Args&&...) {return "End";} 所以我扩展函数我只得到 End 字符串而不是包含所有 args 的字符串解析为字符串。

所以我的问题是如何使这个功能正常工作

tprintf("{1} {3} + {2} = {4} {1}.", "", 7.5 , 4, 11.5);
4

2 回答 2

0

你最终会得到类似的东西:

a.append(pass("7.5"), pass("4"), pass("11.5"))

它将“结束”附加到 a。

首先,很明显, cout 不会在这里接受你的“数组”,即使你实际上给了它一个数组。你需要一个一个输出参数。所以你必须通过递归提取每一个。

于 2013-06-08T09:40:32.810 回答
0

您可能会使用 lambda 函数。

template< typename ... args >
void tprintf( char const * fmt, args const & ... a ) {
    std::array< std::function< void() >, sizeof ... (a) > fmt_fun
        = { [&a]{ std::cout << a; } ... };

    for ( ; * fmt; ++ fmt ) {
        ...
        std::size_t fmt_n = * fmt - '0';
        fmt_fun[ fmt_n ](); // print nth argument
        ...
    }
}

请注意,不需要元编程风格的递归包迭代。

嗯,这段代码在 Clang中工作,但在 GCC 中运行与一个长期存在的错误相冲突。

于 2013-06-08T11:11:21.113 回答