小编And*_*dyG的帖子

这种类型是否很明确?

我的结构如下.

struct result{
    int a;
    int b;
    int c;
    int d;
}
Run Code Online (Sandbox Code Playgroud)

和联盟如下.

union convert{
   int arr[4];
   struct result res;
}
Run Code Online (Sandbox Code Playgroud)

我输入双关语如下.

  int arr1[4] = {1,2,3,5};
  union convert *pointer = (union convert *) arr1; // Here is my question, is it well defined?

  printf("%d %d\n", pointer->res.a, pointer->res.b);
Run Code Online (Sandbox Code Playgroud)

c language-lawyer

14
推荐指数
2
解决办法
1130
查看次数

C++ std :: function-like模板语法

在C++ 11中,您可以像这样实例化std :: function:

std::function<void(int)> f1;
std::function<int(std::string, std::string)> f2;
//and so on
Run Code Online (Sandbox Code Playgroud)

但是虽然网上有大量关于可变参数模板的信息,但我找不到任何关于如何编写std :: function-like模板的文章,这些模板会接受带括号的参数.任何人都可以解释一下语法及其局限性,或者至少指出现有的解释吗?

syntax templates variadic-templates c++11 std-function

13
推荐指数
2
解决办法
1684
查看次数

静态模板化constexpr嵌套类成员

我有以下Foo带嵌套类的示例类Bar,一切都是constexpr:

class Foo
{
private:
    template <typename T>
    struct Bar
    {
        constexpr Bar(){}
        constexpr int DoTheThing() const
        {
            return 1;
        }
    };

public:
    constexpr static auto b = Bar<int>{};
    constexpr Foo() {}
    constexpr int DoTheThing() const
    {
        return b.DoTheThing();
    }
};
Run Code Online (Sandbox Code Playgroud)

我想测试那个调用Foo::DoTheThing返回1:

int main()
{
   constexpr Foo f;
   static_assert(f.DoTheThing() == 1, "DoTheThing() should return 1");
}
Run Code Online (Sandbox Code Playgroud)

GCC和Clang都在这里抱怨,但MSVC没有

GCC说:

错误:constexpr Foo::Bar<T>::Bar() [with T = int]在定义之前使用

constexpr static auto b = …
Run Code Online (Sandbox Code Playgroud)

c++ templates language-lawyer constexpr c++14

13
推荐指数
1
解决办法
551
查看次数

如何使用std :: make_shared避免大内存分配

假设我有一些任意的类,A:

class A {
 //... stuff
};
Run Code Online (Sandbox Code Playgroud)

我想调用一个外部API,它接受一个类型的共享指针,就像这样(我不能改变这个接口):

//...much later
void foo(std::shared_ptr<A> _a){
    //operate on _a as a shared_ptr
}
Run Code Online (Sandbox Code Playgroud)

但是,在我正在使用的(遗留)代码中,我正在使用的类A实例被分配在堆栈上(我无法解决):

A a;
//...some stuff on a
//Now time to call foo
Run Code Online (Sandbox Code Playgroud)

除此之外,A类的实例非常大,每个实例大约1 GB.

我知道我可以打电话

foo(std::make_shared<A> a);
Run Code Online (Sandbox Code Playgroud)

但这会为A副本分配内存,我真的很想避免.

有没有办法将一些调用std::make_shared(可能是move语义)一起破解,这样我就不会被迫为另一个A类实例分配内存?

我尝试过这样的事情:

foo(std::make_shared<A>(std::move(a)));
Run Code Online (Sandbox Code Playgroud)

但据我所知,A仍然创造了一个新的实例.

示例代码

#include <iostream>
#include <memory>
using namespace std;


class A{
    public:
    A(int _var=42) : var(_var){cout << "Default" << endl;}
    A(const A& _rhs) : var(_rhs.var){cout << …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management c++11

12
推荐指数
3
解决办法
2448
查看次数

使用ref arg获取lambda的std :: thread无法编译

我正在阅读C++并发性.第2.4章描述了parallell_accumulate算法.

我尝试 - 作为一个学习实验 - 用一般的lambda替换那里使用的仿函数.

我已将编译错误提炼为:

#include <thread>

template <typename T>
struct f {
    void operator() (T& result) { result = 1;}
};

int main() {
    int x = 0;
    auto g = [](auto& result) { result = 1; };

    std::thread(f<int>(), std::ref(x));  // COMPILES
    std::thread(g, std::ref(x));         // FAILS TO COMPILE
}
Run Code Online (Sandbox Code Playgroud)

错误消息:

 In file included from /usr/include/c++/4.9/thread:39:0,
                 from foo.cpp:1:
/usr/include/c++/4.9/functional: In instantiation of ‘struct std::_Bind_simple<main()::<lambda(auto:1&)>(std::reference_wrapper<int>)>’:
/usr/include/c++/4.9/thread:140:47:   required from ‘std::thread::thread(_Callable&&, _Args&& ...) [with _Callable = main()::<lambda(auto:1&)>&; _Args = …
Run Code Online (Sandbox Code Playgroud)

c++ generics lambda c++14

12
推荐指数
2
解决办法
2381
查看次数

在Python中计算BLEU分数

有一个测试句和一个参考句.如何编写一个Python脚本,以自动机器翻译评估中使用的BLEU度量标准来衡量这两个句子之间的相似性?

python nltk

11
推荐指数
3
解决办法
2万
查看次数

为什么循环节拍索引在这里?

几年前,有人发布Active State Recipes用于比较目的,三个python/NumPy函数; 每个都接受相同的参数并返回相同的结果,即距离矩阵.

其中两个来自公开来源; 它们都是 - 或者它们在我看来是 - 惯用的numpy代码.创建距离矩阵所需的重复计算由numpy优雅的索引语法驱动.这是其中之一:

from numpy.matlib import repmat, repeat

def calcDistanceMatrixFastEuclidean(points):
  numPoints = len(points)
  distMat = sqrt(sum((repmat(points, numPoints, 1) - 
             repeat(points, numPoints, axis=0))**2, axis=1))
  return distMat.reshape((numPoints,numPoints))
Run Code Online (Sandbox Code Playgroud)

第三个使用单个循环创建了距离矩阵(显然,由于只有1,000个2D点的距离矩阵,有一百万个条目,因此很多循环).乍一看这个函数看起来像我在学习NumPy时编写的代码,我会编写NumPy代码,首先编写Python代码,然后逐行翻译.

在Active State帖子发布几个月之后,在NumPy邮件列表的一个帖子中发布并讨论了比较三者的性能测试结果.

事实上,循环函数明显优于其他两个函数:

from numpy import mat, zeros, newaxis

def calcDistanceMatrixFastEuclidean2(nDimPoints):
  nDimPoints = array(nDimPoints)
  n,m = nDimPoints.shape
  delta = zeros((n,n),'d')
  for d in xrange(m):
    data = nDimPoints[:,d]
    delta += (data - data[:,newaxis])**2
  return sqrt(delta)
Run Code Online (Sandbox Code Playgroud)

线程中的一位参与者(Keir Mierle)提供了为什么这可能是真的:

我怀疑它会更快的原因是它具有更好的局部性,在移动到下一个工作集之前完全完成对相对较小的工作集的计算.一个衬垫必须重复地将潜在的大MxN阵列拉入处理器. …

python performance memory-management numpy

10
推荐指数
1
解决办法
419
查看次数

C++使用双重比较的奇怪行为

我正在为我的应用程序开发一个单元测试,但是我遇到了一个我不明白的奇怪问题.

代码是:

double res = BytesTool::convertSize(1, BytesTool::Byte, BytesTool::KiloByte);
double tmp = pow((double)1000, -1);
QVERIFY(res == tmp);
Run Code Online (Sandbox Code Playgroud)

我正在使用Linux机器(主机64位)编译Linux 64位,使用gcc(主机64位),并使用Linux的mingw32编译器对Windows 32位进行交叉编译.

该程序在调试和发布模式下的Linux编译工作正常(断言成功).对于Windows版本,它在调试版本中工作正常,但不适用于发行版本; 断言失败了.

奇怪的是,如果我插入一个跟踪,测试在Windows中工作:

double res = BytesTool::convertSize(1, BytesTool::Byte, BytesTool::KiloByte);
printf("test");
double tmp = pow((double)1000, -1);
QVERIFY(res == tmp); // Is TRUE when printf("test") is present, FALSE otherwise
Run Code Online (Sandbox Code Playgroud)

我迷路了,我真的不明白发生了什么.为什么printf让它工作?

谢谢您帮忙.

c++ double

10
推荐指数
1
解决办法
242
查看次数

而不是"数据行0","数据行1"等输出自定义名称

在Visual Studio Team Foundation Server 2013中,我正在使用单元测试框架.具体来说,我正在使用将从XML文件中读取的数据驱动测试.

我的问题的要点

这是一些示例代码:

using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class DataDrivenTestingClass{
   public TestContext TestContext{get; set;}

   [TestMethod]
   [DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML", "test.xml", "XMLTests", DataAccessMethod.Sequential)]
   public void MyOnlyDataDrivenTestFromXML(){
      var testName = TestContext.DataRow[0].ToString();
      //... blah blah blah other logic
      //<snip>
      Assert.IsTrue(true); //of course this is not what I really do
   }
}
Run Code Online (Sandbox Code Playgroud)

输出将如下所示:

测试通过 - MyOnlyDataDrivenTestFromXML(数据行0)
测试通过 - MyOnlyDataDrivenTestFromXML(数据行1)
测试通过 - ...
测试通过 - MyOnlyDataDrivenTestFromXML(数据行N)

显然,(Data Row i)不是很具描述性.XML存储了我想要使用的名称(我可以使用其他任何东西,但已经在xml中使用它似乎很方便).不过,我不确定这是可能的.


其他信息,猜测

问题是,虽然您可以从TestContextvia 获取测试名称TestContext.TestName,但您无法设置它.此外,你不能(不应该)简单地继承TestContext并制作一个允许你这样做的人.

我也试图直接从设定的名字PropertiesTestContext …

c# tfs unit-testing visual-studio-2012

10
推荐指数
1
解决办法
2906
查看次数

如何检查const_reverse_iterator到reverse_iterator的赋值是无效的?

考虑以下:

using vector_type = std::vector<int>;
using const_iterator = typename vector_type::const_iterator;
using const_reverse_iterator = typename vector_type::const_reverse_iterator;
using iterator = typename vector_type::iterator;
using reverse_iterator = typename vector_type::reverse_iterator;

int main()
{
    static_assert(!std::is_assignable_v<iterator, const_iterator>); // passes
    static_assert(!std::is_assignable_v<reverse_iterator, const_reverse_iterator>); // fails
    static_assert(std::is_assignable_v<reverse_iterator, const_reverse_iterator>); // passes
}
Run Code Online (Sandbox Code Playgroud)

我可以检查分配iterator{} = const_iterator{}是无效的,但不能检查reverse_iterator{} = const_reverse_iterator{}具有此类型特征的分配.

此行为在gcc 9.0.0,clang 8.0.0MSVC 19.00.23506中是一致的

这很不幸,因为实际情况是reverse_iterator{} = const_reverse_iterator{}实际上并没有使用任何上述编译器进行编译.

如何可靠地检查此类作业是否无效?

类型特征的这种行为意味着表达式

std::declval<reverse_iterator>() = std::declval<const_reverse_iterator>() 
Run Code Online (Sandbox Code Playgroud)

根据[meta.unary.prop]很好地形成,这看起来与我自己在is_assignable类型特征上的尝试一致.

c++ c++17

10
推荐指数
2
解决办法
184
查看次数