c++ - 不带参数的部分特化函数模板

标签 c++ templates c++14 template-specialization

我认为这是不可能的,但必须有人知道得更多......

template<typename T>   
T Read()   //T is int, char, etc
{
    return read<T>();
}

template<typename T, Size> 
std::array<T,Size> Read<std::array<T, Size>>()
{
     return unique_read<T, Size>();
}

我想一旦我指定了任何模板参数,它就不再是完全特化,并且函数中不允许部分特化

我唯一能想到的是:

template<typename T>
struct _dummy
{
    T Read() {
        return T();
    };
};

template<typename T, size_t Size>
struct _dummy<std::array<T, Size>>
{
    using ArrayType = std::array<T, Size>;

    ArrayType Read() {
        return ArrayType();
    };
};

最佳答案

你应该为这种工作使用标签调度:

namespace detail {
template<class T>struct tag{};

template<class T>
T Read(tag<T>) {
    return T{};
}

template<class T, std::size_t N>
std::array<T, N> Read(tag<std::array<T, N>>) {
    return {1,2,3};
}
}

template<class T>
auto Read() {
    return detail::Read(detail::tag<T>());
}

int main() {
    Read<std::array<int,5>>();
}

关于c++ - 不带参数的部分特化函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36209675/

相关文章:

c++ - char temp[3] =""; 是什么意思?

templates - 在 Go 的 HTML 模板中遍历任意数量的嵌套结构 slice

java - jsf页面中的空白页面

c++ - gcc 错误?它莫名其妙地将数组衰减为指针,而clang没有

c++ - GLSL 像素着色器仅运行 0 个纹理单元

c++ - 如何强制编译器发出去虚拟化代码

c++ - VS2012 中的 ADL 错误?

c++ - 在嵌套的 lambda 中捕获通用的可调用对象 - 总是向前?

c++ - 有没有解决 nullptr_t 和指针重载之间歧义的好方法?

c++ - Windows 上的 VSCode : gdb doesn't break on 'throw' but breaks on regular exceptions