C ++模板专业化在某些情况下无法解决

时间:2018-08-15 20:40:43

标签: c++ templates template-specialization

我正在尝试编写模板专业化规范,以将字段序列化到缓冲区中。下面的代码最有效,尽管在将char指针类型传递给代码时遇到了一个奇怪的问题。

template <typename... Args>
struct ArgHandler;

// literal types
template <typename T, typename... Args>
struct ArgHandler<T, Args...>
{
    static uint8_t* insert(uint8_t* buff, const T arg, const Args&... args)
    {   
        auto data = reinterpret_cast<T*>(buff); 
        *data = static_cast<T>(arg);
        return ArgHandler<Args...>::insert(buff + sizeof(T), args...);
    }   
};

// char ptr
template <typename... Args>
struct ArgHandler<const char*, Args...>
{
    // strings
    static uint8_t* insert(uint8_t* buff, const char* arg, const Args&... args)
    {   
        auto* pos = reinterpret_cast<uint8_t*>(stpcpy(reinterpret_cast<char*>(buff), arg)) + 1;
        return ArgHandler<Args...>::insert(pos, args...);
    }   
};

// char array
template <size_t N, typename... Args>
struct ArgHandler<char[N], Args...>
{
    // strings
    static uint8_t* insert(uint8_t* buff, const char (&arg)[N], const Args&... args)
    {   
        auto* pos = reinterpret_cast<uint8_t*>(stpcpy(reinterpret_cast<char*>(buff), &arg[0])) + 1;
        return ArgHandler<Args...>::insert(pos, args...);
    }   
};

// after last arg, end recursion
template <>
struct ArgHandler<>
{
    static uint8_t* insert(uint8_t* buff)
    {   
        return buff;
    }   
};

template <typename... Args>
void insertArgs(uint8_t* buff, const Args&... args)
{
    ArgHandler<Args...>::insert(buff, args...);
}

如果我在函数堆栈上创建一个char ptr,然后将其传递给我的缓冲区插入代码,则一切正常。但是,在同一代码中,如果我将调用函数的参数直接传递到缓冲区插入函数中,则编译器将解析为错误的专业化(特别是“文字类型”专业化)。

// works
void someFunction(const char* str)
{
    uint8_t buff[1024];
    const char* local_str = str;
    insertArgs(buff, local_str);
}

// resolves to incorrect specialization
void someFunction(const char* str)
{
    uint8_t buff[1024];
    insertArgs(buff, str);
}

我怀疑这与我对左值,右值等缺乏了解有关。我们将提供任何帮助!

0 个答案:

没有答案