我看过Nicolai Josuttis(C++标准委员会成员)的一次谈话(确切的时间戳,不是由他解释),他说吸气剂应该是这样编写的:
const std::string& getName() const&
{
return memberStringVar;
}
Run Code Online (Sandbox Code Playgroud)
自从C++ 11以来.问题是,与这个吸气剂相比有什么不同?
const std::string& getName() const
{
return memberStringVar;
}
Run Code Online (Sandbox Code Playgroud)
虽然这个问题可能是重复的,但我不会关闭这个问题,因为通过这个问题的答案及其可能的重复链接可能更容易找到正确的答案.基本上说这个问题的标题比副本的标题更直接(描述性).
通常,如果我想通过枚举创建一个模板(数据)类,我会写这样的东西
enum class Modes : int
{
m1 = 1,
m2 = 2,
m3 = 3
};
template <Modes M>
class DataHolder
{
};
template<>
class DataHolder<Modes::m1>
{
public: int a = 4;
};
Run Code Online (Sandbox Code Playgroud)
然后,如果我想的一样专业化Modes::m1作为Modes::m2我再次写相同的专业化.有没有办法为几个枚举值写一个专门化?我用SFINAE尝试过,但我不是成功的.
template <Modes M, typename = void>
class DataHolder
{
};
template<Modes M, typename = typename std::enable_if<M == Modes::m1 || M == Modes::m2>::type>
class DataHolder
{
public: int a = 4;
};
Run Code Online (Sandbox Code Playgroud)
这不会编译.特别是在我想继续进行不同的专业化之后Modes::m3.我在SO上尝试了许多类似的解决方案,但似乎没有解决问题.
让我们有类Foo和方法void use_weak_ptr(std::weak_ptr<Foo>)。有没有办法确保(最好是在编译时)该方法不会被临时调用?
允许这样做:
auto shared = std::make_shared<Foo>();
use_weak_ptr(shared);
Run Code Online (Sandbox Code Playgroud)
不允许这样做:
use_weak_ptr(std::make_shared<Foo>());
Run Code Online (Sandbox Code Playgroud)
编辑:Godbolt的建议。
我有一个111;222;333要转换为三个整数的字符串。
首先我将字符串分割
std::vector<std::string> split(...){ ... };
Run Code Online (Sandbox Code Playgroud)
返回值vector以推导类型存储
std::vector splitVals {split(...)};
Run Code Online (Sandbox Code Playgroud)
如果我想将值转换为整数,就像这样
int foo1 {std::stoi(splitVals[0])};
Run Code Online (Sandbox Code Playgroud)
该stoi功能是抱怨,是因为推导型的载体是std::vector<std::vector<std::string>, std::allocator<std::vector<std::string>>>的,但如果我不让来推断类型,一切按预期工作。
std::vector<std::string> splitVals {split(...)};
int foo1 {std::stoi(splitVals[0])};
Run Code Online (Sandbox Code Playgroud)
std::stoi现在可以工作了,因为输入值为std::string。问题似乎始于从返回的函数初始化向量std::vector<std::string>。没有这些限制,是否有办法从C ++ 17类模板参数推导中受益?
我有一个类型特征来检查 是否enum class包含名为None.
template<typename T, typename = void>
struct has_none : std::false_type
{
};
template<typename T>
struct has_none<T,
std::void_t<decltype(T::None)>> : std::true_type {};
Run Code Online (Sandbox Code Playgroud)
此检查将与std::is_enum_v. 问题是,我将如何创建一个type_trait来检查 的Enum::None值为0?在谈论时甚至可能type_traits吗?
我有这个代码:
char *sort(char *string){ //shell-sort
int lnght = length(string) - 1; // length is my own function
int gap = lnght / 2;
while (gap > 0)
{
for (int i = 0; i < lnght; i++)
{
int j = i + gap;
int tmp =(int)string[j];
while (j >= gap && tmp > (int)string[j - gap])
{
string[j] = string[j - gap]; // code fails here
j -= gap;
}
string[j] = (char)tmp; // and here as well
} …Run Code Online (Sandbox Code Playgroud)