模板参数的排列顺序错误。这是对的吗?

时间:2018-12-01 20:53:02

标签: c++ templates

我希望在以下程序中获得以下输出: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;
}

我可以反转参数,但我认为这是不正确的。

1 个答案:

答案 0 :(得分:1)

显示的代码中的关键行:

 int crutch[] = { mycode<T>(tpl, s)... };

参数包基本上将扩展为:

 int crutch[] = { mycode<double>(1.3, s), mycode<int>(2, s) };

简而言之,mycode的实现将其参数附加到缓冲区。

这里的问题是,在这种情况下,C ++没有确定的评估顺序。每个函数调用都可能首先执行,并且每次运行同一程序时,它可能会有所不同。在这种情况下,不能保证您从左到右的评估顺序。这两个参数都可能首先被附加到缓冲区。