我希望在以下程序中获得以下输出:2 1.2。但是模板参数的列表是相反的(据我所知)。应该是这样吗?
void print_id(int i, double d) noexcept {
std::cout << i << ' ' << d << std::endl;
}
template <typename G>
int mycode(G item, std::string & p) noexcept {
p.append((const char*)&item, sizeof(G));
return 1;
}
template<typename G>
const char* iterate(const char* &p) noexcept {
// std::cout << (typeid(G)).name() << " "; It gets know that the first type is 'double', the next is 'int'
const char* ans = p;
p += sizeof(G);
return ans;
}
template<typename ...T>
std::function<void(const char*)> state_f(void(*func)(T...)) {
return [func](const char* p) {
func(*(const T*)(iterate<T>(p))...);
};
}
template<typename ...T>
std::string encode(T... tpl) noexcept {
std::string s;
int crutch[] = { mycode<T>(tpl, s)... };
return s;
}
int main(void)
{
auto f = state_f(print_id);
f(encode(2, 1.2).c_str());
return 0;
}
我可以反转参数,但我认为这是不正确的。
答案 0 :(得分:1)
显示的代码中的关键行:
int crutch[] = { mycode<T>(tpl, s)... };
参数包基本上将扩展为:
int crutch[] = { mycode<double>(1.3, s), mycode<int>(2, s) };
简而言之,mycode
的实现将其参数附加到缓冲区。
这里的问题是,在这种情况下,C ++没有确定的评估顺序。每个函数调用都可能首先执行,并且每次运行同一程序时,它可能会有所不同。在这种情况下,不能保证您从左到右的评估顺序。这两个参数都可能首先被附加到缓冲区。