小编aby*_*s.7的帖子

为什么通用模板方法定义与模板类专门化不匹配?

我有以下代码:

template <class T, class U = T>
class A {
  public:
    void f();
};

template <class T>
class A<T, T> {
  public:
    void f();  // Unaltered method.

    // Some differences.
};

template <class T, class U>
void A<T, U>::f() {}

int main() {
  A<int> a;
  a.f();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

clang++ -std=c++11 test.cc给我一个错误:undefined reference to 'A<int, int>::f()'

为什么提供的方法定义f()不适用于该类A<int, int>

c++ templates c++11

7
推荐指数
1
解决办法
244
查看次数

弹跳球逻辑

我有一个弹跳墙的球.这个反弹很简单,我只是这样做,(代码片段)

if ( x - moveSpeed < 0 ) // Ball hit left wall
    xVel *= -1;
Run Code Online (Sandbox Code Playgroud)

但是我也有一个玩家移动的矩形.这种反弹实际上就像墙上的反弹一样.

但是我发现,当一个球像图片一样运动时,我不可能让它再次直线上升.因此,我需要对矩形运动进行某种计算以影响球的输出角度.移动时矩形始终保持恒定的移动速度.这张照片显示了一个向左移动的矩形,球在移动过程中撞击它,形成90度角.(不应该总是90).

抱歉我的蹩脚图片我希望它们有意义.我的数学生锈了,这就是为什么我真的需要朝着正确的方向努力.

c++ algorithm bounce game-physics

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

如何连接两个boost :: asio :: streambuf?

boost::asio用作网络框架.作为它使用的读/写介质boost::asio::streambuf.我想要:

  • 在一个缓冲区中读取一些消息
  • 在第一个缓冲区的开头添加第二个缓冲区
  • 发送新的复合邮件

有什么可能的有效(零拷贝)选项来做到这一点?

c++ boost-asio

6
推荐指数
1
解决办法
2034
查看次数

针对INTEL GPU的OpenCL SDK Linux下载

是否有适用于Linux的英特尔OpenCL SDK下载?我正在为我的intel i5(HD 4000图形)寻找一个opencl sdk,看起来他们只有它用于Windows.

linux intel opencl

6
推荐指数
2
解决办法
5951
查看次数

如何正确地散列自定义结构?

在C++语言有默认的哈希函数模板std::hash<T>的最简单的类型,如std::string,int等我想,这些功能有很好的熵和相应的随机变量的分布是均匀的统计.如果不是,那么让我们假装它是.

然后,我有一个结构:

struct CustomType {
  int field1;
  short field2;
  string field3;
  // ...
};
Run Code Online (Sandbox Code Playgroud)

我想哈希它,使用其中一些字段的单独哈希,比方说,std::hash(field1)std::hash(field2).两个哈希都在一组可能的类型值中size_t.

什么是好的哈希函数,可以将这些结果组合并将它们映射回来size_t

c++ hash probability

6
推荐指数
2
解决办法
7385
查看次数

如何在 Mac 上自动创建“close-on-exec”套接字?

当我在 Linux 上创建套接字时,可以O_CLOEXEC在创建时指定标志:

auto fd = socket(AF_INET, SOCK_STREAM|SOCK_CLOEXEC, 0);
Run Code Online (Sandbox Code Playgroud)

所以没有办法,其他线程会在这个套接字保持打开的情况下做fork()+ exec()

但是在 Mac 上,根据手册,我不能做同样的事情:

套接字具有指定的类型,它指定了通信的语义。当前定义的类型有: SOCK_STREAM SOCK_DGRAM SOCK_RAW SOCK_SEQPACKET SOCK_RDM

该标志O_CLOEXEC只能通过调用来设置fcntl()。而且这不是原子方式 - 某些线程可能会exec()在对socket()和 的调用之间执行fcntl()

如何解决这个问题?

c sockets macos exec fcntl

6
推荐指数
1
解决办法
1157
查看次数

如何在C++中限制函数之外的`using`语句的范围?

我想定义一些模板特化的静态成员,如下所示:

namespace A {

template <> int C<A1::A2::...::MyClass1>::member1_ = 5;
template <> int C<A1::A2::...::MyClass1>::member2_ = 5;
template <> int C<A1::A2::...::MyClass1>::member3_ = 5;

template <> int C<B1::B2::...::MyClass2>::member1_ = 6;
template <> int C<B1::B2::...::MyClass2>::member2_ = 6;
template <> int C<B1::B2::...::MyClass2>::member3_ = 6;

...

}
Run Code Online (Sandbox Code Playgroud)

但是为了简化代码(并使其看起来更结构化),我想做这样的事情:

namespace A {

{
  using T = A1::A2::...::MyClass1;
  template <> int C<T>::member1_ = 5;
  template <> int C<T>::member2_ = 5;
  template <> int C<T>::member3_ = 5;
}

{
  using T = B1::B2::...::MyClass2;
  template <> int C<T>::member1_ = …
Run Code Online (Sandbox Code Playgroud)

c++ templates namespaces template-specialization c++11

6
推荐指数
1
解决办法
447
查看次数

如何在C++ 11中实现类型化字符串?

在我的项目中,在同一范围内有许多具有不同含义的字符串,例如:

std::string function_name = "name";
std::string hash = "0x123456";
std::string flag = "--configure";
Run Code Online (Sandbox Code Playgroud)

我想通过它们的含义来区分不同的字符串,以便与函数重载一起使用:

void Process(const std::string& string_type1);
void Process(const std::string& string_type2);
Run Code Online (Sandbox Code Playgroud)

显然,我必须使用不同的类型:

void Process(const StringType1& string);
void Process(const StringType2& string);
Run Code Online (Sandbox Code Playgroud)

但是如何以优雅的方式实现这些类型呢?我所能得到的就是:

class StringType1 {
  std::string str_;
 public:
  explicit StringType1(const std::string& str) : str_(str) {}
  std::string& toString() { return str_; }
};

// Same thing with StringType2, etc.
Run Code Online (Sandbox Code Playgroud)

你能建议更方便吗?


重命名函数没有意义,因为主要目标是不要错误地传递一种字符串类型而不是另一种字符串:

void ProcessType1(const std::string str);
void ProcessType2(const std::string str);

std::string str1, str2, str3;

// What should I pass where?..
Run Code Online (Sandbox Code Playgroud)

c++ syntactic-sugar c++11

6
推荐指数
2
解决办法
333
查看次数

模板函数中的volatile类型推导有什么问题?

我有一个模板功能:

template <typename T>
inline void Acquire_Store(volatile T* ptr, T value) {
  // ...
}
Run Code Online (Sandbox Code Playgroud)

当我尝试像这样调用它时:

volatile Node* node;
Acquire_Store(&node, static_cast<Node*>(nullptr));
Run Code Online (Sandbox Code Playgroud)

这两个g ++,clang ++编译器都是这样的:

推导出参数'T'的冲突类型('volatile List :: Node*'vs.'List :: Node*')

调用此模板函数的正确方法是什么?

更新.

现在我不确定它node的类型 - 也许,我应该改成它Node* volatile node;

我希望变量node是易变的,但不是指向的对象.

c++ templates g++ volatile clang++

5
推荐指数
1
解决办法
505
查看次数

如何正确处理信号,以便gperftools CPU Profiler仍然有效?

我想描述我的守护程序,它暂停主线程:

sigset_t signal_mask;
sigemptyset(&signal_mask);
sigaddset(&signal_mask, SIGTERM);
sigaddset(&signal_mask, SIGINT);

int sig;
sigwait(&signal_mask, &sig);
Run Code Online (Sandbox Code Playgroud)

所有其他线程只是阻止所有信号.据我所知,探查器使用SIGPROF信号进行操作.如果我使用这样的代码开始分析,则输出.prof文件为空:

env CPUPROFILE = daemon.prof ./daemon

我应该如何正确处理主线程和其他线程中的信号以启用性能分析?或者可能是其他地方的问题?

c++ profiler multithreading signals gperftools

5
推荐指数
1
解决办法
851
查看次数