小编JeJ*_*eJo的帖子

使用 std::enable_if 重载 std::unique_ptr 删除器方法

我正在尝试为我的 编写一个删除器std::unique_ptr,并且我想重载删除方法。这是我尝试过的,但编译器抱怨使用std::enable_if_t. 代码是使用-std=c++20标志编译的。

template <class T>
class custom_deleter
{
public:
    template <class U, std::enable_if_t<std::is_array_v<T>, bool> = true>
    void operator()(U* ptr) { std::cout << "array"; }

    template <class U, std::enable_if_t<!std::is_array_v<T>, bool> = true>
    void operator()(U* ptr) { std::cout << "non-array"; }
};
Run Code Online (Sandbox Code Playgroud)

这是编译器错误:

main.cpp:17:10: error: no type named 'type' in 'struct std::enable_if<false, bool>'
   17 |     void operator()(U* ptr) { std::cout << "non-array"; }
      |          ^~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我不明白这个问题。起初,我以为我缺少std::enable_if_t可用的包含或编译标志,但这不是这里的问题。任何帮助表示赞赏。

c++ templates sfinae unique-ptr c++20

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

如何使 std::map::find 函数区分大小写?

我面试过一家跨国公司。他给了我以下代码并要求我使find()函数区分大小写。我尝试过,但无法理解如何使内置查找函数区分大小写。有没有办法使其区分大小写以仅查找特定的键值?

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

int main()
{
    map<string, int> mp;
    mp["Test"] = 1;
    mp["test"] = 2;
    mp["TEST"] = 3;
    mp["tesT"] = 4;    

    for (auto it = mp.find("TEST"); it != mp.end(); it++)
    {
        cout << it->first << " " << it->second << endl;
    }

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

输出 :

TEST 3
Test 1
tesT 4
test 2
Run Code Online (Sandbox Code Playgroud)

但我期望输出是:

TEST 3
Run Code Online (Sandbox Code Playgroud)

c++ stdmap std find c++11

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

如何在不使用任何循环的情况下将 std::vector 或数组插入到 std::forward_list 中?

forward_list<int> listOne;
forward_list<int> listTwo;
vector<int> arr = {2,4,3};
forward_list<int>::iterator it;
Run Code Online (Sandbox Code Playgroud)

在上面提到的代码中,我想插入一个std::vectorinlistOne并尝试使用insert_after函数。


it = listOne.begin();
listOne.insert_after(it,arr);
Run Code Online (Sandbox Code Playgroud)

但这没有用。

我想知道,有没有办法std::vector在 a 中添加 a 或 数组std::forward_list而不需要任何循环?

c++ algorithm std stdvector forward-list

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

关于构造函数和内存泄漏的问题

我正在使用构造函数和析构函数进行测试,我想看看是否可以在不先声明的情况下将对象传递给函数,如下例所示:

#include<iostream>
#include<stdlib.h>
using namespace std;

class car
{
public:
    string name;
    int num;

public:
    car(string a, int n)
    {
        cout << "Constructor called" << endl;
        this->name = a;
        this->num = n;
    }
    ~car()
    {
        cout << "Deleted" << endl;
    }
};

void display(car* p)
{
    cout << "Name: " << p->name << endl;
    cout << "Num: " << p->num << endl;
}

int main()
{
    display(new car("HYUNDAI", 2012));
}
Run Code Online (Sandbox Code Playgroud)

display功能运行良好,并且完全符合我的预期,但我想知道:

  • new如果我在输入中声明了关键字display,为什么我的用户定义的析构函数没有被调用,并且
  • 这会new导致内存泄漏吗?

c++ constructor destructor memory-leaks class

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

为什么这在正常的 for 循环中有效,但在基于范围的 for 循环中无效?

void set_fee(Patron p, int fee)
{
    for (Patron x : patrons)
    {
        if (p.get_name() == x.get_name()) x.set_fee(fee);
    }
    
    for (int i = 0; i < patrons.size(); i++)
    {
        if (patrons[i].get_name() == p.get_name()) patrons[i].set_fee(fee);
    }
}
Run Code Online (Sandbox Code Playgroud)

patron只是我创建的一些类,这里的任何函数都不重要,get_name()只是返回对象的名称并将对象的费用set_fee(fee)设置为费用。fee

但是有人知道为什么第一个循环不起作用但第二个循环起作用吗?p我基本上只是想在向量内部查找patrons,一旦找到它,我想更改向量内赞助对象的费用,但第一种方法不起作用,为什么?

c++ for-loop stdvector c++11 range-based-loop

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

如何使用抽象类作为foreach循环的索引变量的类型?

我正在将我的Java程序翻译为C++我在尝试以与Java中相同的方式使用多态性时遇到了问题。

我的代码看起来像这样:


class Base
{
public:
    virtual void print() = 0;
};

class Derived_1 : public Base
{
public:
    void print()
    {
        std::cout << "1" << std::endl;
    }
};

class Derived_2 : public Base
{
public:
    void print()
    {
        std::cout << "2" << std::endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

接下来是我尝试过的主要方法的两个版本,都给我编译器错误

1:

int main(int argc, char const *argv[])
{
    std::vector<Base> v;
    
    v.push_back(Derived_1());
    v.push_back(Derived_2());

    for(Base i: v)
    {
        i.print();
    }

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

错误:

object of …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism abstract-class pointers class

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

根据传递给构造函数的参数数量进行推导

这是我正在尝试的东西,但似乎不起作用:我想根据类对象的实例化方式来切换编译时开关。如果只有一个构造函数参数,则LengthOpt应该等于false,否则等于true(我的实现有多个构造函数,其中开关应默认为true.

我尝试创建一个推导指南,但显然如果模板参数没有显示为构造函数参数(这真是令人沮丧),它就不起作用。有谁知道这个问题的不太详细的解决方案?

代码

#include <cstring>
#include <iostream>

const char* str = "some input string";


template <bool LengthOpt>
class some_class
{
public:
    some_class(const char*) {
        std::cout << std::boolalpha << LengthOpt << std::endl;
    }
    some_class(const char*, size_t len) {
        std::cout << std::boolalpha << LengthOpt << std::endl;
    }
};

template <bool LengthOpt> some_class(const char*) -> some_class<false>;
template <bool LengthOpt> some_class(const char*, size_t) -> some_class<true>;

int main()
{
    some_class A(str);
    some_class B(str, strlen(str));
}
Run Code Online (Sandbox Code Playgroud)

错误 …

c++ constructor-overloading c++17 ctad deduction-guide

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

带有很少参数的模板函数的推导

我有几个模板函数的实例。它们中的每一个都按顺序执行每个给定的 lambda,并附带特定的消息。当我使用一个 lambda 执行此操作时,一切正常,但是当我尝试添加多个 lambda 时,我得到

note: candidate template ignored: deduced conflicting types for parameter 'Task'
Run Code Online (Sandbox Code Playgroud)

来自铿锵。这是我的代码:


template <class Task> void doTasks(Task task1)  // works fine
{  
    if (std::__is_invocable<Task>::value) 
    {
        std::cout << "doing first task" << endl;
        task1;
    }
}

template <class Task>
void doTasks(Task task1, Task task2) // deduced conflicting types
{ 
    if (std::__is_invocable<Task>::value) 
    {
        std::cout << "doing first task" << endl;
        task1();
        std::cout << "doing second task" << endl;
        task2();
    }
}


int main()
{
    doTasks([&] …
Run Code Online (Sandbox Code Playgroud)

c++ templates function-templates template-argument-deduction c++17

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

当模板函数也匹配时,如何定义特殊的句柄函数?

我有一个带有模板函数和一个特殊函数的类,如下所示:

#include <bits/stdc++.h>
using namespace std;

class A
{ 
 public:
  template <typename T>
  void test(const T& t) 
  {
    cout << "template " << t << endl;
  }

  void test(const std::string& s) {
    cout << "test " << s << endl;
  }
};

int main() 
{
  A a;
  a.test("asdas");
}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,有两个test函数:

  1. template功能
  2. 仅匹配输入的特殊函数std::string

我想要的是:

  1. test(1)-> 调用template函数test<int>(1)
  2. std::string str = "asd"; test(str);-> 调用特殊函数test(str)
  3. test("asd")-> 调用特殊函数test(std::string str = "asd")

如何实现这一目标?

c++ templates class member-functions c++11

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

如何编写添加函数链?

我对从哪里开始解决这个问题有疑问。问题需要如下。

// We want to create a function that will add numbers together,
// when called in succession.

add(1)(2); // == 3

Run Code Online (Sandbox Code Playgroud)

我从未见过以这种方式使用函数,目前我不知道从哪里开始。此外,我尝试对参数链进行一些研究,但这就是我能找到的全部。

https://levelup.gitconnected.com/how-to-implement-method-chaining-in-c-3ec9f255972a

如果你们有任何疑问,我可以编辑我的代码或问题。任何帮助表示赞赏。

c++ algorithm function function-call chaining

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