我正在尝试为我的 编写一个删除器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可用的包含或编译标志,但这不是这里的问题。任何帮助表示赞赏。
我面试过一家跨国公司。他给了我以下代码并要求我使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) 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而不需要任何循环?
我正在使用构造函数和析构函数进行测试,我想看看是否可以在不先声明的情况下将对象传递给函数,如下例所示:
#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导致内存泄漏吗?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,一旦找到它,我想更改向量内赞助对象的费用,但第一种方法不起作用,为什么?
我正在将我的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) 这是我正在尝试的东西,但似乎不起作用:我想根据类对象的实例化方式来切换编译时开关。如果只有一个构造函数参数,则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)
错误 …
我有几个模板函数的实例。它们中的每一个都按顺序执行每个给定的 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
我有一个带有模板函数和一个特殊函数的类,如下所示:
#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函数:
template功能std::string。我想要的是:
test(1)-> 调用template函数test<int>(1)std::string str = "asd"; test(str);-> 调用特殊函数test(str)test("asd")-> 调用特殊函数test(std::string str = "asd")如何实现这一目标?
我对从哪里开始解决这个问题有疑问。问题需要如下。
// 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++ ×10
c++11 ×3
class ×3
templates ×3
algorithm ×2
c++17 ×2
std ×2
stdvector ×2
c++20 ×1
chaining ×1
constructor ×1
ctad ×1
destructor ×1
find ×1
for-loop ×1
forward-list ×1
function ×1
memory-leaks ×1
pointers ×1
polymorphism ×1
sfinae ×1
stdmap ×1
template-argument-deduction ×1
unique-ptr ×1