Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.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
STL扩展/修改最佳实践 我已经用C++写了几个月了,现在我已经很舒服地开始了我自己的库了,我已经发现了我自己反复使用的东西。让我烦恼的一件事是,您总是必须为诸如std::acculate、std::fill等函数提供一个开始和结束迭代器 namespace std { // or my library root namespace 'cherry' template <typename C, typename T> decltype(auto) count(const C& container, const T& value); }_C++_Visual C++_C++14 - Fatal编程技术网

STL扩展/修改最佳实践 我已经用C++写了几个月了,现在我已经很舒服地开始了我自己的库了,我已经发现了我自己反复使用的东西。让我烦恼的一件事是,您总是必须为诸如std::acculate、std::fill等函数提供一个开始和结束迭代器 namespace std { // or my library root namespace 'cherry' template <typename C, typename T> decltype(auto) count(const C& container, const T& value); }

STL扩展/修改最佳实践 我已经用C++写了几个月了,现在我已经很舒服地开始了我自己的库了,我已经发现了我自己反复使用的东西。让我烦恼的一件事是,您总是必须为诸如std::acculate、std::fill等函数提供一个开始和结束迭代器 namespace std { // or my library root namespace 'cherry' template <typename C, typename T> decltype(auto) count(const C& container, const T& value); },c++,visual-c++,c++14,C++,Visual C++,C++14,提供一个合格容器的选项完全不存在,一遍又一遍地写begin和end简直是一件麻烦事。所以,我决定将这个功能添加到我的库中,但我遇到了一个问题,我想不出最好的方法。以下是我的一般解决方案: namespace std { // or my library root namespace 'cherry' template <typename C, typename T> decltype(auto) count(const C& container, const

提供一个合格容器的选项完全不存在,一遍又一遍地写begin和end简直是一件麻烦事。所以,我决定将这个功能添加到我的库中,但我遇到了一个问题,我想不出最好的方法。以下是我的一般解决方案:

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
1。宏 -封装整个函数调用的宏
例如:快速(FCall)

-采用容器、函数名和可选参数的宏
例如
QUICK\u STL(C、F、Args…)

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
2。包装函数/函子

-采用容器、函数名和可选参数的类
例如,
quick\u stl(F,C,Args…)

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
3。过载功能 -重载命名空间
std
或我的库命名空间中的每个函数

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
namespace std{//或我的库根命名空间'cherry'
模板
decltype(自动)计数(常数C和容器、常数T和值);
}


namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
我通常避开宏,但在这种情况下,它可以节省很多 从正在编写的代码行数。关于函数重载,我想使用的每一个函数都必须重载,这并不能真正扩展。不过,这种方法的好处是保留了函数的名称。通过完美的转发和
decltype(auto)
重载变得更加容易,但仍然需要时间来实现,如果添加了其他函数,则必须对其进行修改。至于我是否应该重载
std
名称空间,我相当怀疑它在这种情况下是否合适

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
在STD名称空间中重载函数最合适的方法是什么(注意,这些函数只作为原始函数的代理)?

您需要阅读以下内容:

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
这是:

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
我用C++写了一个<强>几个月< /强>,我很舒服。 现在已经足够开始实现我自己的库了

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
让我看看光明的一面,就说。。。我们中的一些人以前去过那里……:)

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
有一件事让我烦恼,那就是你总是要提供 函数的开始和结束迭代器,如 标准::累积,标准::填充等

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
这就是为什么你和埃里克的建议,似乎是不可能做到的C++17

namespace std { // or my library root namespace 'cherry' 
    template <typename C, typename T>
    decltype(auto) count(const C& container, const T& value);
}
  • namespace std { // or my library root namespace 'cherry' 
        template <typename C, typename T>
        decltype(auto) count(const C& container, const T& value);
    }
    
  • 包装函数/函子
  • 还不错…只要你做得正确,你就可以做到,这就是范围对容器的基本作用。。。请参见上述实现

    namespace std { // or my library root namespace 'cherry' 
        template <typename C, typename T>
        decltype(auto) count(const C& container, const T& value);
    }
    
  • 过载功能

    namespace std { // or my library root namespace 'cherry' 
        template <typename C, typename T>
        decltype(auto) count(const C& container, const T& value);
    }
    
    • 重载命名空间中的每个函数
      std
  • 不要那样做。。。C++标准不喜欢它。
    namespace std { // or my library root namespace 'cherry' 
        template <typename C, typename T>
        decltype(auto) count(const C& container, const T& value);
    }
    
    看看标准是怎么说的

    namespace std { // or my library root namespace 'cherry' 
        template <typename C, typename T>
        decltype(auto) count(const C& container, const T& value);
    }
    
    <> >如果将名称或定义添加到命名空间STD或命名空间内,则C++程序的行为是未定义的 名称空间std,除非另有规定。程序可以添加模板 仅将任何标准库模板专用化为命名空间std 如果声明依赖于用户定义的类型和 专业化满足 原始模板,并没有明确禁止

    namespace std { // or my library root namespace 'cherry' 
        template <typename C, typename T>
        decltype(auto) count(const C& container, const T& value);
    }
    
    我通常避开宏啊,好。。。但在这种情况下,它可以避免编写大量代码。不!!!这是个陷阱!!!