小编Jar*_*d42的帖子

C++从两个类中确定void*的类型

我正在使用wxWidgets,我的地图编辑器中有一个搜索功能用于我的在线游戏.

我搜索不同条件的对象,并按名称将这些对象放在ComboBox列表中,并将对象添加为引用数据(void*),

我有一个事件onClickResult我想标记并跳转到有效的对象,但它在对象类型之间切换时崩溃我的应用程序,因为我似乎无法" reinterpret_cast"确定没有关系的类对象(没有子类,没有任何子类,两个独立的类)关系).

问题:有没有办法确定哪些数据类型位于void*(event.GetClientData()正在返回void*)并正确投射?

void SearchResultWindow::OnClickResult(wxCommandEvent& event) {
    Item* item = reinterpret_cast<Item*>(event.GetClientData());
    if (item) {
        this->selectRelatedMapItem(item);
    } else {
        Creature* creature = reinterpret_cast<Creature*>(event.GetClientData());
        if (creature) {
            this->selectRelatedMapCreature(creature);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++ types casting

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

C++函数返回字符串

#include <iostream>

using namespace std;

string test(string s)
{
    string rv = "Hey Hello";
    if(s=="")
        return rv;
    else
        cout<<"Not returning"<<endl;

}

int main()
{
    string ss = test("test");
    cout<<ss<<endl;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码不应该返回任何值,并且可能打印垃圾,但它返回" Hey Hello ",即使在测试函数的末尾没有return语句.你能告诉我为什么它的表现如此吗?

c++ string c++11

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

根据实例化的不同,期望不同的类型

我希望下面的NDR形成不良,但似乎不是:-(

#include <type_traits>

template <typename T, typename Enabler = void>
struct is_complete : std::false_type {};

template <typename T>
struct is_complete<T, std::void_t<decltype(sizeof(T) != 0)>> : std::true_type {};

class X;

static_assert(!is_complete<X>::type{}); // incomplete type

class X {};

static_assert(!is_complete<X>::type{}); // complete, but already instantiated
Run Code Online (Sandbox Code Playgroud)

演示

注意:假设sizeof(T) != 0对完整性特征有效(因为没有类型可以使用sizeof(T) == 0,使用其他常量会强制为特征找到更好的名称:-))

如果已经隐式实例化了隐式实例化的特殊化,它是代码的变体吗?,程序已被宣布为格式错误的程序,无需诊断(NDR),因为该方法 is_complete_helper<X>::test<X> 具有2种不同的含义,具体取决于实例化点.

似乎附近的参考文件使程序形成不良,但并不像我所理解的那样:

在假设实例中对这种构造的解释不同于在模板的任何实际实例化中对相应构造的解释.

函数模板,成员函数模板或类模板的成员函数或静态数据成员的特化可以在翻译单元内具有多个实例化点,并且除了上述实例化的点之外,对于任何这样的实例化.在翻译单元内具有实例化点的专门化,翻译单元的末尾也被认为是实例化的点.类模板的专门化在翻译单元中最多只有一个实例化点.任何模板的特化可以在多个翻译单元中具有实例化点.如果两个不同的实例化点根据单定义规则给出模板特化的不同含义,则程序形成错误,不需要诊断.

我错了 ?或者不幸的是这个程序是正确的.

c++ templates language-lawyer template-instantiation

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

如何在模板类函数中分配struct值?

我有一堆结构需要添加到我的矢量并给它们一些默认值.

  1. 结构是外部的,我无法改变它们.
  2. 在分配这些值时,为了方便起见,我需要查看struct成员名称.
  3. 为方便起见,我需要在同一个地方直观地显示所有默认值.
  4. 编译器当前优化了myClass :: addStruct()中未使用的if分支 - 这正是我想要的.

问:可以用更好/更简单的方式完成吗?

编辑我没有C++ 17

//外部结构

typedef struct A {
    int member1;
    float member2;
    char *member3;
    // ...
} A;

typedef struct B {
    double member5;
    float member3;
    int *member4;
    // ...
} B;

typedef struct C {
    char* member5;
    char* member2;
    float *member3;
    // ...
} C;

...

template <class T>
void myClass::addStruct(std::vector<T> &vp)
{
    void *sp = nullptr;
    if(std::is_same<T, A>::value) {
        A s{};
        s.member1 = 2;
        s.member3 = "whatever";
        sp …
Run Code Online (Sandbox Code Playgroud)

c++ factory visual-c++

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

myArray [N],其中N = 1,000,000会返回错误,而myArray [1,000,000]则不会

文件扩展名:.cpp

我有以下代码:

int main() {
    int N; cin >> N;
    int myArray[N];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我输入N为1,000,000,那么当我尝试运行该程序时,我会收到错误.但是,当我设置myArray[N]myArray[1000000],它没有.为什么会这样?

c++ variable-length-array

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

我怎么能跳过那些警告?C++

已添加代码:

bool CHARACTER::SpamAllowBuf(const char *Message)
{
    if (!strcmp(Message, "(??´c)") || !strcmp(Message, "(?·)") || !strcmp(Message, "(±a?Y)") || !strcmp(Message, "(AA??)") || !strcmp(Message, "(?c¶?)") || !strcmp(Message, "(???e)") || !strcmp(Message, "(??C?)") || !strcmp(Message, "(????)") || !strcmp(Message, "(AE??)"))
    {
        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

警告给出:

char.cpp:7254:121: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp:7254:245: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp:7254:275: warning: trigraph ??) ignored, use -trigraphs to enable
Run Code Online (Sandbox Code Playgroud)

我怎么能跳过这个警告?

c++ trigraphs

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

什么是根据它们在句子中的位置对这些字符串输入进行排序的更快的方法?

为国家信息学奥林匹克运动会的实践偶然发现了一个问题:用户输入句子中的单词数量(n)以及输入单词的收益以及用空格分隔的位置.系统会要求您输入正确的单词顺序.

例如:

输入:

4
this 1
sentence 4
is 2
a 3
Run Code Online (Sandbox Code Playgroud)

输出:

this is a sentence
Run Code Online (Sandbox Code Playgroud)

限制:

1 <= N <= 3 * 10^5
1 <= Size of a word <= 50
Run Code Online (Sandbox Code Playgroud)

我试图使用unordered_map解决这个问题,事实证明这很快解决了所有测试案例只需0.588秒,这使我的解决方案成为45中最快的第五个.但是最快的解决方案只需要0.14秒来计算我无法弄清楚他/她是如何做到的.与使用unordered_map相比,解决此问题的更快捷方法是什么?

unordered_map < int, string > words;    
int n;    
cin >> n;  
for (int i = 0; i < n; i++) {    
    string word;    
    int position;     
    cin >> word >> position;    
    words[position] = word;    
}    
for (int i = 1; i <= n; i++) {     
    cout << …
Run Code Online (Sandbox Code Playgroud)

c++ optimization

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

头文件中的内联Lambda

这与我所见过的其他问题类似,但是考虑到C ++ 17对内联变量的介绍,值得提出。考虑以下模式:

auto to_ref = [](auto const& ptr) -> decltype(auto) { return *ptr; }

std::vector<std::unique_ptr<Foo>> foo_ptrs = from_somewhere();
for (Foo const& foo : foo_ptrs | transform(to_ref)) {
}
Run Code Online (Sandbox Code Playgroud)

to_ref通用拉姆达是......嗯,通用...所以是有意义的把它放在一个头这样的人不是到处复制它。

我的问题:模板的链接注意事项也适用于通用lambda吗?换句话说,编译器/链接器有责任确保对于具有相同模板参数的给定模板的多个实例化,不违反ODR。我可以依靠相同的行为,还是应该在inline说明符之前添加说明符auto to_ref = ...;

c++ lambda one-definition-rule

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

为什么C++中的内置堆栈接口没有clear()函数?

在进一步使用它之前我必须清空堆栈。我确实明白可以这样做:

while (!mystack.empty()) { mystack.pop(); }

没有这个功能有什么具体原因吗?或者只是第一次制作时没有人感受到它的要求而被排除在外

另外,Java中的栈接口确实有一个clear()功能。

c++ stack

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

编译时未知的 constexpr 函数参数布尔值 C++

我需要运行一个带有 N 个布尔变量的函数,我想让它们 constexpr 以消除比较并从分支预测失败中保存代码。

我的意思是:

templateFunc<b1, b2, b3, b4 ...>(args...);
Run Code Online (Sandbox Code Playgroud)

由于 b1..bn 变量只是布尔变量并且可能只有 2 个状态,我可以这样写:

if (b1 && b2)
  templateFunc<true, true>(args...);
else if (b1 && !b2)
  templateFunc<true, false>(args...);
else if (!b1 && b2)
  templateFunc<false, true>(args...);
else
  templateFunc<false, false>(args...);
Run Code Online (Sandbox Code Playgroud)

问题很明显,我需要对 5 个变量进行 64 次调用。有什么解决方案吗?

c++ templates variadic-templates constexpr branch-prediction

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