我有一个带有一些源文件的C++项目proj1,但我想也使用我在另一个项目proj2中的一些源文件.proj1和proj2都是目录my_projects的子目录.我不希望eclipse复制文件,因为我想确保我只有一个副本可以编辑.这就像MS Visual Studio的"添加现有项目"选项.
我的目标最终结果是能够为proj1和proj2创建makefile,将两个目录压缩在一起并将它们发送给同事,这样他们就可以使用make自己构建这两个项目.
这在Eclipse中可行吗?我搜索过但没有找到解决方案.
菲尔
我正在尝试编写一个库,其中有一些模板化函数,其中一些是辅助函数,因此我不希望我的用户可以访问它们.一些基本代码可能是
//mylib.h
namespace myfuncs
{
template<class T>
void helper (T input, int extrainformation)
{
//do some usefull things
}
template<class T>
void dostuff(T input)
{
int someinfo=4;
helper(input, someinfo);
}
}
Run Code Online (Sandbox Code Playgroud)
有可能以某种方式隐藏辅助函数,以便库的用户不能直接调用它吗?我原以为一个未命名的命名空间可能会起作用,但因为我使用的是模板,所以我无法在头文件和实现文件之间拆分函数声明和主体.将未命名的命名空间放在头文件中是没有用的,也不好用.我唯一能想到的就是创建一个mylib
类并将这些函数封装为私有/公共静态函数.
任何更好的解决方案将不胜感激.
菲尔
我正在用 C++ 编写一个库。该库有多个头文件和 cpp 文件,需要跨平台(Windows Visual Studio 和 Linux gcc)。构建时,库和头文件安装在某个系统目录中,在同一台机器上的其他代码可以找到它们(例如 Linux 系统上的 /usr/local)。
如果我的标题之一需要#include 我的其他标题之一,那么我应该使用尖括号还是引号?
我觉得安装库后应该使用尖括号,以便检查系统目录,但是在构建库时我需要使用引号,以便检查本地目录并且我不会选择过时的版本从系统目录。
我知道 ow 的不同版本#include <filename>
和#include “filename”
含义。对于编写库的情况,我在问哪个是合适的,为什么是合适的。
我正在使用visual studio 2012,想知道high_resolution_clock的准确性.
基本上我正在编写一些代码来显示声音和图像,但是我需要它们才能很好地同步,并且图像必须是无泪的.我正在使用directX来提供无泪图像,并使用high_resolution_clock进行计时屏幕刷新.显示器声称为60 fps,然而,使用high_resolution_clock的时序提供60.035 fps的刷新率,平均超过10000次屏幕刷新.根据哪个是正确的,我的音频将在一秒钟后以0.5毫秒结束,一小时后约为2秒.我希望任何时钟都比这更准确 - 更像是1年的漂移,而不是一个小时.
有没有人曾经看过这种东西.我应该期待我的声卡时钟再次不同吗?
编辑这是我的计时代码.这个while循环在我的渲染线程中运行.m_renderData是包含渲染场景所需数据的结构数组,每个屏幕有一个元素.对于测试我只在一个屏幕上运行,因此它只有一个元素
while(!TestDestroy())
{
for(size_t i=0; i<m_renderData.size(); ++i)
{
//work out where in the vsync cycle we are and increment the render cycle
//as needed until we need to actually render
D3DRASTER_STATUS rStatus;
m_renderData[i].deviceD3D9->GetRasterStatus(0, &rStatus);
if(m_renderData[i].renderStage==inVBlankRenderingComplete)
{
if(!rStatus.InVBlank)
m_renderData[i].renderStage=notInVBlank;
}
else if(m_renderData[i].renderStage==notInVBlank)
{
if(rStatus.InVBlank)
m_renderData[i].renderStage=inVBlankReadyToRender;
}
//check for missing the vsync for rendering
bool timeOut=false;
if(m_renderData[i].durations.size()>0)
{
double timeSinceLastRender=std::chrono::duration_cast<std::chrono::microseconds>(std::chrono::high_resolution_clock::now()-m_renderData[i].durations.back()).count();
if (timeSinceLastRender>expectedUpdatePeriod*1.2)
timeOut=true;
}
if(m_renderData[i].renderStage==inVBlankReadyToRender || timeOut)
{
//We have reached the time …
Run Code Online (Sandbox Code Playgroud) 我有一种情况,我希望朋友类调用私有方法,然后我想让这个方法虚拟,所以派生一个类的方法将被调用 - 然后我当然意识到友谊不是继承.所以我们有一种情况,其中虚方法意味着应该调用派生类的方法,但是这个方法是私有的,因此无法调用.哪个有优先权?
我在MSVC++ 2008上测试了这个,如下所示
#include<iostream>
class Loner;
class Base
{
friend Loner;
private:
virtual void test(){std::cout << "Base" << std::endl;}
};
class Derived : public Base
{
private:
virtual void test(){std::cout << "Derived" << std::endl;}
};
class Loner
{
public:
void test(Base *base){base->test();}
};
int main()
{
Loner loner;
Derived derived;
loner.test(&derived);
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Derived
Run Code Online (Sandbox Code Playgroud)
因此,似乎虚拟功能"获胜"并让私人成员访问非朋友 - 几乎是朋友继承!
我的问题是,有谁知道这是否是正确的行为?当我最终完成升级我的编译器版本或者如果我尝试GCC时,这种行为会改变吗?
干杯
菲尔
当编写具有返回类型的函数时,auto
我们可以使用constexpr if
返回不同的类型。
auto myfunc()
{
constexpr if (someBool)
{
type1 first = something;
return first;
}
else
{
type2 second = somethingElse;
return second;
}
}
Run Code Online (Sandbox Code Playgroud)
然而,我正在努力弄清楚如何仅将其中一种类型作为参考。看来以下代码仍然返回两个分支的右值
auto myfunc()
{
constexpr if (someBool)
{
type1 &first = refToSomething;
return first;
}
else
{
type2 second = somethingElse;
return second;
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?谷歌并没有透露太多,因为有很多关于自动和引用返回的更一般使用的教程。在我的特定情况下,该函数是一个类方法,我想返回对成员变量的引用或数组的视图。
我有以下模板化功能
//This is a very naive implementation, but it will do
template<class T>
T determinant(const std::vector<std::vector<T>> &matrix)
{
sci::assertThrow(square(matrix), sci::err());
if (matrix.size() == 1)
return matrix[0][0];
else if (matrix.size() == 2)
return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];
else
{
double result = 0;
std::vector<std::vector<double>> minor(matrix.size() - 1);
double multiplier = 1.0;
for (size_t i = 0; i < matrix.size(); ++i)
{
for (size_t j = 0; j < minor.size(); ++j)
{
if (j < i)
minor[j] = matrix[j]; …
Run Code Online (Sandbox Code Playgroud)