相关疑难解决方法(0)

使用模板而不是开关

我想在我的代码中执行一组类似的测试,但仅根据参数进行更改.

我可以用switch语句写这个:

bool doTest(EnumSensorFamily family, const StructSensorProposal& proposed)
{
  switch (family)
  {
  case FAM1:
    return (ExpectedFam1 == proposed.Fam1SensorId);
    break;
  case FAM2:
    return (ExpectedFam2 == proposed.Fam2SensorId);
    break;
  case FAM3:
    return (ExpectedFam3 == proposed.Fam3SensorId);
    break;
  default:
    ERROR ("Unexpected family");
    return false;
  }
}
Run Code Online (Sandbox Code Playgroud)

我想用模板特化来做这件事

template <EnumSensorFamily family>
bool doTest(const StructSensorProposal& proposed);

template<>
bool doTest<FAM1> (const StructSensorProposal& proposed)
{
  return (ExpectedFam1 == proposed.Fam1SensorId);
}

template<>
bool doTest<FAM2> (const StructSensorProposal& proposed)
{
  return (ExpectedFam2 == proposed.Fam2SensorId);
}

template<>
bool doTest<FAM3> (const StructSensorProposal& proposed)
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates

8
推荐指数
2
解决办法
6631
查看次数

什么是"Class ::*"

我正在学习SFINAE(替换失败不是)我在网站上找到了一个例子,

template<typename T>
class is_class {
   typedef char yes[1];
   typedef char no [2];
   template<typename C> static yes& test(int C::*); // What is C::*?
   template<typename C> static no&  test(...);
   public:
   static bool const value = sizeof(test<T>(0)) == sizeof(yes);
};
Run Code Online (Sandbox Code Playgroud)

int C::*在第5行发现了一个新的签名.起初我以为它是,operator*但我想这不是真的.请告诉我它是什么.

c++

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

C++ 遍历结构体的成员

说我有一个结构:

struct Boundary {
  int top;
  int left;
  int bottom;
  int right;
}
Run Code Online (Sandbox Code Playgroud)

和一个向量

std::vector<Boundary> boundaries;
Run Code Online (Sandbox Code Playgroud)

什么是最C ++风格的方式来访问结构得到的总和topleftbottomright分别?

我可以写一个循环

for (auto boundary: boundaries) {
  sum_top+=boundary.top;
  sum_bottom+=boundary.bottom;
  ...
}
Run Code Online (Sandbox Code Playgroud)

这似乎有很多重复。当然,我可以这样做:

std::vector<std::vector<int>> boundaries;

for (auto boundary: boundaries) {
  for(size_t i=0; i<boundary.size();i++) {
    sums.at(i)+=boundary.at(i)
  }
}
Run Code Online (Sandbox Code Playgroud)

但是后来我会丢失所有有意义的结构成员名称。有没有办法让我可以编写类似以下函数的内容:

sum_top=make_sum(boundaries,"top");
Run Code Online (Sandbox Code Playgroud)

反射似乎不是 C++ 中的一个选项。我愿意使用 C++ 到版本 14。

c++

7
推荐指数
2
解决办法
687
查看次数

了解指向成员的运营商

我从c ++练习册中复制了这个程序.幕后发生了什么?

预期的产出是:

sum = 30 sum = 70

#include<iostream>
using namespace std;

class M
{
    int x;
    int y;
public:
    void set_xy(int a, int b)
    {
        x=a;
        y=b;
    }
    friend int sum(M m);
};

int sum (M m);
//so far so good, problem begins from here. what's happening after here?
{                               
    int M ::*px = &M ::x;
    int M ::*py = &M ::y;
    M *pm =&m;
    int s= m.*px+ pm->*py;
    return s;
}

int main()
{
    M n;
    void …
Run Code Online (Sandbox Code Playgroud)

c++ pointers compiler-errors pointer-to-member dereference

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

如何获取引用成员的指针?

考虑以下代码:

struct AA
{
    int& rr;
};
Run Code Online (Sandbox Code Playgroud)

有没有办法获得指针(或可能参考),AA::rr以获得这个?

AA* aa;
auto mm = &AA::rr; // error: cannot create pointer to reference member ‘AA::rr’
aa ->* mm;
Run Code Online (Sandbox Code Playgroud)

此外,在gcc-7.0.1 decltype(AA::mm)仅仅是int&.这是根据标准吗?这有道理吗?


编辑

对不起,伙计,我提出的问题并不是很好.没有人抱怨引用不是对象或者没有指向引用的指针.目标很自私.鉴于struct AA { int& rr; };我只想拥有这样的函数:

template < typename Class, typename Member >
void test(Member Class::*) { }
Run Code Online (Sandbox Code Playgroud)

在调用的时候test(&AA::rr)我想ClassAAMemberint&int.所以我甚至不需要指针本身,但它的类型将允许检索类类型和成员类型.

c++ gcc reference pointer-to-member argument-deduction

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

`:: *`(冒号)在C ++中是什么意思?

当我的朋友正在阅读此hpp文件时,有一小段代码难以理解。特别,

  • 哪些呢一定形成如A(B, C)int(int, int)或在这种情况下T(Type::*)的手段?我已经看过诸如的用法std::function<int(int, int)>,但仍然不知道int(int, int)单独意味着什么。
  • 什么Type::*意思 星号如何::直接跟随?

c++

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

为什么在C++中使用函数指针到成员方法?

很多C++书籍和教程都解释了如何做到这一点,但我没有看到一个给出令人信服的理由选择这样做.

我很清楚为什么在C中需要函数指针(例如,当使用一些POSIX工具时).但是,由于"this"参数,AFAIK无法向其发送成员函数.但是如果你已经在使用类和对象,为什么不使用像functor这样的面向对象的解决方案?

您将不得不使用此类函数指针的真实示例将不胜感激.

更新:我感谢大家的回答.不过,我不得不说,这些例子中没有一个确实让我相信这是一个从纯OO角度来看的有效机制......

c++ function-pointers

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

在C++中,为什么指向类成员的指针包含偏移量而不是地址?

通常指针包含地址.为什么指向类成员的指针包含偏移量?

讨论指向类数据成员的指针,而不是指向成员函数的指针.

c++ offset pointer-to-member class-members

4
推荐指数
2
解决办法
216
查看次数

(为什么)我们可以在初始化时将非静态类成员分配给静态变量吗?

在更大的代码库中,我遇到过这样的代码(参见 Godbolt):

struct Foo {};

struct Base {
    Foo* a;
};

struct Bar : public Base {
    static Foo* Bar::*mybar[];
};

Foo* Bar::Bar::*mybar[] = {
    &Base::a
};
Run Code Online (Sandbox Code Playgroud)

老实说,我很困惑。这看起来像是在初始化一个静态Foo指针数组,Bar其中包含一个非静态成员变量Base。没有对象怎么可能呢?

(免责声明:这是在实际工作的生产代码中发现的 - 希望不依赖于 UB?)

另外,如果我删除像这里这样的限定名称查找有什么问题吗?我想重构代码并使其更具可读性。所有这些Bar::似乎都是多余的,但由于我对代码感觉不太舒服,我宁愿先了解其含义。

c++ inheritance static class c++11

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

使用变量访问Struct中的任何数据?

我有一个包含19个变量的结构,我需要使用不同的排序算法来对这个结构进行排序,事实是它可以通过任何这些变量进行排序.我想知道是否有任何方法可以在结构中动态访问这些数据,这样我就可以编写一个方法来进行排序,而不是编写19个不同的方法来运行相同的排序算法但是在内部的不同变量上.

所以我有我的结构

struct team_stats{
    float yards_per_game;
    int total_points;
etc etc

team_stats* arr = new team_stats[32];
Run Code Online (Sandbox Code Playgroud)

我想做这样的事情(显然它不会是一个字符串因为这没有意义,但只是这背后的想法):

quickSort(arr, "yards_per_game"); // sorts by yards per game
quickSort(arr, "total_points"); // sorts by total points

quickSort(team_stats* arr, string field) {
    while (i <= j) {
        while (arr[i].field < pivot)
etc. etc.
Run Code Online (Sandbox Code Playgroud)

而不是像这样做:

if (field == "yards_per_game")
    quickSortYards(arr);
else if (field == "total_points")
    quickSortPoints(arr);

quickSortYards(team_stats* arr) {
    while (i <= j) {
        while (arr[i].yards_per_game < pivot)
etc. etc.

quickSortPoints(team_stats* arr) {
    while (i <= j) …
Run Code Online (Sandbox Code Playgroud)

c++ struct

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