我正在实现可变的最小/最大函数.目标是利用编译时已知的参数数量并执行展开的评估(避免运行时循环).代码的当前状态如下(呈现min - max类似)
#include <iostream>
using namespace std;
template<typename T>
T vmin(T val1, T val2)
{
return val1 < val2 ? val1 : val2;
}
template<typename T, typename... Ts>
T vmin(T val1, T val2, Ts&&... vs)
{
return val1 < val2 ?
vmin(val1, std::forward<Ts>(vs)...) :
vmin(val2, std::forward<Ts>(vs)...);
}
int main()
{
cout << vmin(3, 2, 1, 2, 5) << endl;
cout << vmin(3., 1.2, 1.3, 2., 5.2) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
现在这可行,但我有一些问题/问题:
该 …
当我链接项目时,我收到这个错误,
COMMUNICATION.obj:致命错误LNK1179:文件无效或损坏:重复COMDAT'_IID_IXMLDOMImplementation'
这个问题的根源是什么?
重载模板化函数时,如果编译器可以选择以下任一选项,则编译器应如何选择要调用的版本:
func<T>(foo))。考虑以下C ++代码:
#include <stdio.h>
struct Parent {};
struct Child : public Parent {};
template <typename T>
void func(T) {
printf("func(T)\n");
}
void func(Parent) {
printf("func(Parent)\n");
}
int main() {
func(1);
func(Parent());
func(Child());
}
Run Code Online (Sandbox Code Playgroud)
用gcc或clang编译,输出:
func(T)
func(Parent)
func(T)
Run Code Online (Sandbox Code Playgroud)
前两行是预期的并且有意义。但是,在call中func(Child()),它可以像调用一样容易func(Parent)(这似乎(如果有的话)应该执行的操作)。
因此,我有两个主要问题:
func(Parent)在传递a时调用Child?我可以在自己的代码中解决此要求,并且此示例是我尝试做的简化版本,但我认为这是相同的问题。
我有一段时间以前写的这个功能:
template <class C, class T>
static inline bool findClosestObject( const C& container, const TimeUnit& now, T& object );
Run Code Online (Sandbox Code Playgroud)
C 是T元素的容器TimeUnit 是一个封装日期和时间的类T是一个有TimeUnit信息的对象此函数std::lower_bound在容器中执行二进制搜索(使用)以查找最接近的对象now.
当我们进行二分查找时,必须对容器进行排序.该函数用于许多种容器(C可以是std::vector,std::set,std::map...)在很多地方.有时我们使用sorted std::vector而不是std::set因为它们的内存管理更快,也因为历史问题和与使用向量的其他代码的兼容性.
问题是我在代码中找到了一个地方,开发人员findClosestObject用一个没有排序的容器调用....好的bug ...而且我无法安全地识别出可以完成的所有地方.
所以我现在需要通过在这个特定的情况下对容器进行排序来防止它(它将会很慢但是至少会工作并且保证函数返回我们希望它返回的内容)
所以我试着修改我的功能:
template <class C, class T>
static inline const C& fixOrder( const C& container, C& temp )
{
if ( std::is_sorted( container.begin(), container.end() )
{
return container;
}
else
{ …Run Code Online (Sandbox Code Playgroud)