Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 绕过显式专业化的标准限制_C++_Templates_C++14 - Fatal编程技术网

C++ 绕过显式专业化的标准限制

C++ 绕过显式专业化的标准限制,c++,templates,c++14,C++,Templates,C++14,我正在努力以一种非常好的方式编码成员函数的变量模板的显式特化。问题是,正如前面所解释的,标准禁止在非命名空间范围中进行显式专门化。MSVC允许这样做,但GCC(可能还有其他更标准的编译器)不允许这样做。 (假设它只是为了简单而打印) 结构A { 样板 A(Args…Args){print(int(Args)…);} 样板 无效打印(整数优先,剩余…剩余)常量 { std::是否可以写入正常的重载 void print(int first) const { std::cout << f

我正在努力以一种非常好的方式编码成员函数的变量模板的显式特化。问题是,正如前面所解释的,标准禁止在非命名空间范围中进行显式专门化。MSVC允许这样做,但GCC(可能还有其他更标准的编译器)不允许这样做。
(假设它只是为了简单而打印)

结构A { 样板 A(Args…Args){print(int(Args)…);} 样板 无效打印(整数优先,剩余…剩余)常量 {
std::是否可以写入正常的重载

void print(int first) const { std::cout << first; }

void print(int-first)const{std::cout有一个到coliru的链接。也在这里粘贴了相同的代码。很酷,我的评论与你的更新同步。只需删除
模板
。谢谢,@T.C.。它解决了我的两个问题…而且YG发布了一个更扩展的答案。嗯..就是这么简单…我仍然记得
模板void f(T){}void f(int){}
是一个UB,出于某种原因,我在这里也避免了重载。Ofc我关心的问题与此无关,但我决定这样做,甚至没有思考:D也感谢您提供了标记的分派示例-一些新的知识。总之,在我的两种问题情况下,重载都很好。
void print(int first) const { std::cout << first; }
struct A
{
    template<class... Args>
    struct A_tag{};

    template<typename ...Args>
    A(Args... args) { print(A_tag<Args...>{}, int(args)...); }

    template<typename ...Rest>
    void print(A_tag<int, Rest...>, int first, Rest... rest) const
    {
        std::cout << first;
        print(A_tag<Rest...>{}, int(rest)...);
    }

    void print(A_tag<int>, int first) const { std::cout << first; }
};