我希望在以下程序中获得以下输出: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;
}
我可以反转参数,但我认为这是不正确的。
最佳答案
显示的代码中的关键行:
int crutch[] = { mycode<T>(tpl, s)... };
该参数包将基本上扩展为:
int crutch[] = { mycode<double>(1.3, s), mycode<int>(2, s) };
长话短说
mycode
的实现将其参数附加到缓冲区。这里的问题在于,在这种情况下,C++没有确定的评估顺序。每个函数调用都可能首先执行,并且每次运行同一程序时,它可能会有所不同。在这种情况下,不能保证您从左到右的评估顺序。任何一个参数都可能首先被附加到缓冲区。
关于c++ - 模板参数的排列顺序错误。这是正确的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53574943/