我想在我的代码中执行一组类似的测试,但仅根据参数进行更改.
我可以用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) 我正在学习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*但我想这不是真的.请告诉我它是什么.
说我有一个结构:
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 ++风格的方式来访问结构得到的总和top,left,bottom和right分别?
我可以写一个循环
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 ++练习册中复制了这个程序.幕后发生了什么?
预期的产出是:
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) 考虑以下代码:
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)我想Class是AA和Member是int&或int.所以我甚至不需要指针本身,但它的类型将允许检索类类型和成员类型.
很多C++书籍和教程都解释了如何做到这一点,但我没有看到一个给出令人信服的理由选择这样做.
我很清楚为什么在C中需要函数指针(例如,当使用一些POSIX工具时).但是,由于"this"参数,AFAIK无法向其发送成员函数.但是如果你已经在使用类和对象,为什么不使用像functor这样的面向对象的解决方案?
您将不得不使用此类函数指针的真实示例将不胜感激.
更新:我感谢大家的回答.不过,我不得不说,这些例子中没有一个确实让我相信这是一个从纯OO角度来看的有效机制......
通常指针包含地址.为什么指向类成员的指针包含偏移量?
讨论指向类数据成员的指针,而不是指向成员函数的指针.
在更大的代码库中,我遇到过这样的代码(参见 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::似乎都是多余的,但由于我对代码感觉不太舒服,我宁愿先了解其含义。
我有一个包含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)