我已阅读有关异常安全的内容并提出以下问题:
A类中m_value和m_data应该一致。但如果
m_data = data;
Run Code Online (Sandbox Code Playgroud)
throw 类不变量将被破坏。
class A
{
public:
void Set(const std::vector<unsigned int>& data)
{
m_value = ComputeValue(data);
m_data = data;
}
private:
int m_value; //That should be consistent with vector
std::vector<unsigned int> m_data;
}
Run Code Online (Sandbox Code Playgroud)
我应该使用某种复制和交换的变体来保护此代码吗?在这样的每一行代码中使用复制和交换是一个好的决定还是可以按原样使用此代码?
这是我的解决方案,但我不确定我应该使用它还是它是多余的复杂性:
void Set(const std::vector<unsigned int>& data)
{
std::vector<unsigned int> tmp_data(data);
m_value = ComputeValue(tmp_data);
m_data.swap(tmp_data);
}
Run Code Online (Sandbox Code Playgroud)
附加:
另一个问题:我应该编写自己的异常安全分配运算符或交换函数,以便可以像这样使用它:
class B
{
public:
SetA(const A& a)
{
A tmp_a(a);
m_a.swap(tmp_a);
}
private:
A m_a;
}
Run Code Online (Sandbox Code Playgroud)
而在A班
void A::swap(A& rhs)
{
using std::swap;
swap(m_data, rhs.m_data); …Run Code Online (Sandbox Code Playgroud) 是否可以在C#中进行以下专业化?我可以用C++做到这一点,但不了解如何在C#中实现相同的结果.
class GenericPrinter<T>
{
public void Print()
{
Console.WriteLine("Unspecialized method");
}
}
class GenericPrinter<int>
{
public void Print()
{
Console.WriteLine("Specialized with int");
}
}
Run Code Online (Sandbox Code Playgroud)
添加:
建议的GenericPrinterInt解决方案的问题是我需要明确地创建它.new GenericPrinter<int>仍然会打印Unspecialized method.
我想要的是使用来自另一个泛型类的GenericPrinter,而knoledge是T等于int或其他东西.
我正在尝试创建包含路径的属性文件以在我的所有 C++ 项目中使用。
这是存储库结构。
/
/Libs
/Libs2
A.h
B.h
/Sln1
Sln1.sln
Proj1.vcxproj
Sln2.sln
Proj2.vcxproj
Props.props
Run Code Online (Sandbox Code Playgroud)
我想使用属性文件 (Props.props) 将以下包含路径添加到两个项目 ( C:\\Libs;C:\\Libs\Libs2)。
目前我的属性文件中有宏:
Name Value
ProjRoot C:\<path to rep root>
Run Code Online (Sandbox Code Playgroud)
我在包含字符串中使用它: $(ProjRoot)\Libs;$(ProjRoot)\Libs\Libs2
此解决方案的问题是宏值中的硬编码绝对路径。如果我的存储库将克隆到另一个驱动器上,我将必须手动更改它。
我可以在宏值中使用相对于属性文件的路径吗?
IE:
Name Value
ProjRoot ./
Run Code Online (Sandbox Code Playgroud)
其中 ./ 将解析为将使用此属性文件的所有项目中的 Props.props 文件的路径。
我无法使用 $(SolutionDir) 和 $(ProjectDir) 因为可能存在不同嵌套级别的解决方案和项目,因此相对于它们的路径不起作用。
谢谢。