小编Cro*_*man的帖子

以const和const结尾的getter之间的区别

我看过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)

虽然这个问题可能是重复的,但我不会关闭这个问题,因为通过这个问题的答案及其可能的重复链接可能更容易找到正确的答案.基本上说这个问题的标题比副本的标题更直接(描述性).

c++ getter

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

一个模板专门化几个枚举值

通常,如果我想通过枚举创建一个模板(数据)类,我会写这样的东西

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上尝试了许多类似的解决方案,但似乎没有解决问题.

c++ templates template-specialization c++11

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

如何确保weak_ptr不是从临时的shared_ptr创建的?

让我们有类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的建议。

c++ weak-ptr type-traits c++-concepts c++20

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

从函数填充的字符串的推导向量中将String转换为int

我有一个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类模板参数推导中受益?

c++ vector c++17

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

枚举成员值的类型特征

我有一个类型特征来检查 是否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吗?

c++ type-traits c++17

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

在C中交换char数组的元素

我有这个代码:

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)

c

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