我通常使用std::size_t模板参数中需要积分常数的地方.但我注意到,类型系统并不能保护我免受那些乐意将负数作为参数传递给参数的用户的影响.
例如,以下编译会给出灾难性的结果:
#include <iostream>
template<std::size_t I>
struct E1
{
static void apply()
{
std::cout << I << std::endl;
}
};
template<typename T>
constexpr T a = T { -1 };
template<std::size_t... Is>
void E2()
{
for (auto&& i : {Is...}) std::cout << i << " ";
std::cout << std::endl;
}
int main()
{
E1<-1>::apply();
E2<-1, -2, -3>();
//std::cout << a<std::size_t>;
}
Run Code Online (Sandbox Code Playgroud)
有趣的是,变量模板不允许这样做(取消注释最后一行main会导致编译错误).
是否有任何解决方案/解决方案struct和function案例?
在必须推导出函数调用结果类型的上下文中,C++似乎更乐意帮助我们,提供(至少据我所知)以下两个解决方案:
类型特征的结果:
std::result_of<F(Args...)>::type
Run Code Online (Sandbox Code Playgroud)核心语言语法:
decltype(std::declval<F>()(std::declval<Args>()...);
Run Code Online (Sandbox Code Playgroud)我的问题是,这两者之间有什么不同吗?是否存在一个不能被另一个替换的上下文,如果不是为什么我们需要一个类型特征来做一些语言可以开箱即用的东西?
只是想知道为什么这是无效的:
#include <iostream>
template <std::size_t... Is>
void foo(Is&&... args) {
std::cout << "foo called with " << sizeof...(Is) << "params\n";
}
int main() {
foo(1, 2, 3, 4);
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个非常合理的例子,但它在任何我可以得到的编译器上都失败了.
如果我取代size_t的class例子按预期工作.我也尝试使用新的auto模板参数,但没有在线编译器接受这个,所以我不知道这是一个无效的用例还是一致性问题.
我正在观看这个讲座,其中以下示例(@ 29.43)作为专业化呈现:
template<class T>
struct rank
{
static const size_t value = 0u;
}
// partial specialization
template<class U, size_t N>
struct rank<U[N]>
{
static const size_t value = 1 + rank<U>::value;
}
Run Code Online (Sandbox Code Playgroud)
我希望编译错误,抱怨结构的声明是不可预测的,第二个有太多的模板参数.以上怎么不是错误?
丰富的c ++表现力和语法使得在单个签名上使用该语言的多个功能变得有些困难.
例如,我想将成员函数[1]声明为:
virtualoverride //上下文关键字的示例noexceptconst如果我们认为函数也可以,它会变得更复杂
[[deprecated]]标准的措辞看起来像希腊语,即使这不是真的,我不知道什么适用于什么(或什么是语法上的不幸,例如[1]甚至可能是非法的).
我知道阅读单个功能(覆盖,noexcept等)会有所帮助,但有没有关于如何在共同使用中使用它们的指南?(从语法上讲;我不希望/想要回答功能的功能)
为了防止它有所帮助,我认为要解读的摘录如下
8.4.1功能定义具有形式
function-de fi nition:attribute-speci-er-seqopt decl-speci-er-seqopt declarator virt-speci-er-seqopt function-body
template <int I>
struct Number
{
/* appropriate constructor here */
};
Run Code Online (Sandbox Code Playgroud)
通过"利用"我的意思是,有没有办法(隐式或明确地)I推导出的价值?使用示例如下:
Number a(3); // a's type is Number<3>
Run Code Online (Sandbox Code Playgroud) 我正在使用Ubuntu 14.04 LTSAnaconda python安装:
Python 3.5.1 :: Anaconda 2.4.1(64位)
我正在尝试使用此配方在我的ipython笔记本中启用C++交互式编译:
import IPython.core.magic as ipym
@ipym.magics_class
class CppMagics(ipym.Magics):
@ipym.cell_magic
def cpp(self, line, cell=None):
"""Compile, execute C++ code, and return the standard output."""
# Define the source and executable filenames.
source_filename = 'temp.cpp'
program_filename = 'temp.exe'
# Write the code contained in the cell to the C++ file.
with open(source_filename, 'w') as f:
f.write(cell)
# Compile the C++ code into an executable.
compile = self.shell.getoutput("g++ {0:s} -o {1:s}".format( …Run Code Online (Sandbox Code Playgroud) python ipython ipython-notebook ipython-magic jupyter-notebook
我最近在我的windows 10桌面上安装了Cuda 8.0工具包(在删除所有v7.5组件之后).尽管以前的版本与Visual Studio 2015不兼容,但我很高兴看到Nsight可以实际创建一个CUDA项目,并且样本附带了VS 2015版本的.sln文件.
问题是,在编译样本时,我得到的错误如下:
1> C:\ Program Files(x86)\ MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations\CUDA 8.0.targets(168,9):错误MSB4062:"Nvda.Build.CudaTasks.SanitizePaths"任务可以不能从程序集C:\ Program Files(x86)\ MSBuild\Microsoft.Cpp\v4.0\V140\BuildCustomizations\Nvda.Build.CudaTasks.v8.0.dll加载.无法加载文件或程序集"Microsoft.Build.Utilities.v3.5,Version = 3.5.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a"或其依赖项之一.该系统找不到指定的文件.确认声明是否正确,程序集及其所有依赖项是否可用,以及该任务是否包含实现Microsoft.Build.Framework.ITask的公共类.
另一个奇怪的事情是今天早些时候我能够在我的笔记本电脑中编译CUDA样本,其区别仅在于它安装了VS2015 Community Edition.有什么建议?
包含cuda标头的deviceQuery示例:
#include <cuda_runtime.h>
#include <helper_cuda.h>
Run Code Online (Sandbox Code Playgroud)
在它的单个cpp文件中(但没有实际的.cu文件)是唯一一个编译并运行正常的文件(如果这是你想知道的,我确实有一个CUDA兼容的显卡,事实上所有的预安装操作都是如此在安装指南中遵循).
...即使是某人成功/失败并使用相同设置的报告也会有所帮助
说我有两个基类,
struct A {};
struct B {};
Run Code Online (Sandbox Code Playgroud)
以及使用多重继承的派生类
struct D : A, B {};
Run Code Online (Sandbox Code Playgroud)
如果我的使用场景是这样的:
A *obj = new D;
Run Code Online (Sandbox Code Playgroud)
即我永远不会使用B基类来引用派生对象,我是否必须使两个基础的析构函数虚拟?我目前正在申报的析构函数B为protected禁止从这样其他用户,但是否足够?
析构函数怎么样D?
c++ destructor protected multiple-inheritance virtual-destructor
当我使用docker SDK for Python启动容器时,我可以指定主机端口,以便NoneSDK 为我选择一个随机可用端口:
import docker
client = docker.from_env()
container = client.containers.run(
"bfirsh/reticulate-splines",
ports={6379 : None} # SDK chooses a host port
detach=True)
Run Code Online (Sandbox Code Playgroud)
问题是我想知道运行命令后SDK选择了哪个主机端口。我怎么做?