小编Lor*_*ins的帖子

防止非类型模板参数中的类型违规

我通常使用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)

Demo

有趣的是,变量模板不允许这样做(取消注释最后一行main会导致编译错误).

是否有任何解决方案/解决方案structfunction案例?

c++ templates c++14

4
推荐指数
1
解决办法
228
查看次数

关于获取函数结果类型的各种方法

在必须推导出函数调用结果类型的上下文中,C++似乎更乐意帮助我们,提供(至少据我所知)以下两个解决方案:

我的问题是,这两者之间有什么不同吗?是否存在一个不能被另一个替换的上下文,如果不是为什么我们需要一个类型特征来做一些语言可以开箱即用的东西?

c++ type-traits c++14

4
推荐指数
1
解决办法
217
查看次数

为什么这个可变参数模板是错误的?

只是想知道为什么这是无效的:

#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_tclass例子按预期工作.我也尝试使用新的auto模板参数,但没有在线编译器接受这个,所以我不知道这是一个无效的用例还是一致性问题.

c++ variadic-templates

4
推荐指数
1
解决办法
96
查看次数

这是一个什么专业化?

我正在观看这个讲座,其中以下示例(@ 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++ template-meta-programming

3
推荐指数
1
解决办法
96
查看次数

c ++函数签名的语法规范(关键字/上下文关键字排序)是什么?

丰富的c ++表现力和语法使得在单个签名上使用该语言的多个功能变得有些困难.

例如,我想将成员函数[1]声明为:

  • virtual
  • override //上下文关键字的示例
  • noexcept
  • const
  • 具有尾随返回类型

如果我们认为函数也可以,它会变得更复杂

  • 默认
  • 删除
  • final(用于虚拟方法)
  • 模板
  • 明确的专业化
  • [[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

c++

3
推荐指数
1
解决办法
94
查看次数

类模板的模板参数推导可以用于非类型模板参数吗?

像下面这样的类可以利用类模板模板参数推导吗?

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)

c++ templates c++17

3
推荐指数
1
解决办法
291
查看次数

如何在jupyter中定义自定义魔法?

我正在使用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

2
推荐指数
1
解决办法
1854
查看次数

无法在VS 2015中编译CUDA代码

我最近在我的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.有什么建议?

PS

包含cuda标头的deviceQuery示例:

#include <cuda_runtime.h>
#include <helper_cuda.h>
Run Code Online (Sandbox Code Playgroud)

在它的单个cpp文件中(但没有实际的.cu文件)是唯一一个编译并运行正常的文件(如果这是你想知道的,我确实有一个CUDA兼容的显卡,事实上所有的预安装操作都是如此在安装指南中遵循).

系统细节

  • Windows 10专业版
  • Cuda编译工具,8.0版,V8.0.44
  • MS Visual Studio Enterprise 2015 /版本14.0.25431.01更新3
  • Microsoft Visual Studio Enterprise 2015 /版本14.0.25431.01更新3/Microsoft .NET Framework /版本4.6.01586
  • NVIDIA CUDA 8.0 Wizards 8.0
  • 向导创建新的NVIDIA CUDA项目和源文件.
  • NVIDIA Nsight Visual Studio Edition 5.2.0.16223

...即使是某人成功/失败并使用相同设置的报告也会有所帮助

c++ cuda visual-studio-2015

2
推荐指数
1
解决办法
5214
查看次数

您不会用于删除对象的基类的析构函数是虚拟的吗?

说我有两个基类,

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基类来引用派生对象,我是否必须使两个基础的析构函数虚拟?我目前正在申报的析构函数Bprotected禁止从这样其他用户,但是否足够?

析构函数怎么样D

c++ destructor protected multiple-inheritance virtual-destructor

2
推荐指数
1
解决办法
97
查看次数

检索从 Docker SDK for Python 启动的容器的主机端口

当我使用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选择了哪个主机端口。我怎么做?

python docker

2
推荐指数
1
解决办法
1297
查看次数