小编NoS*_*tAl的帖子

什么是特征中的伪表达式?

完整使用该术语的文档,例如

Pseudo expression providing partial reduction operations
Run Code Online (Sandbox Code Playgroud)
Pseudo expression providing matrix output with given format
Run Code Online (Sandbox Code Playgroud)

但我找不到它的意思。

c++ eigen

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

将返回类型的函数参数的常量性与概念匹配

C++ 容器不包含 const 元素,例如您有const std::vector<int>,而不是std::vector<const int>。当我尝试根据传递的容器是否为常量来调整函数的返回值类型时,这有点不幸。

这是一个激励性的例子,请不要过多关注算法或boost的使用,我只使用它,因为C++ optional 不支持引用。

这段代码似乎可以工作,但代码看起来很丑,所以我想知道概念是否给我们提供了一种以更好的方式编写它的方法。我认为不是,因为基本上概念只是谓词,但我希望有一些好的东西,特别是返回类型非常垃圾。

    template<typename C>
    using match_const = std::conditional_t< std::is_const_v<std::remove_reference_t<C>>,
            const typename std::remove_reference_t<C>::value_type,
            typename std::remove_reference_t<C>::value_type>;

    // no constraints
    auto ofind(auto& container, const auto& value) -> boost::optional<match_const<decltype(container)>&> {
        if (auto it = std::ranges::find(container, value); it!=container.end()){
            return *it;
        }
        return boost::none;
    }
    
    // dummy concept
    template<typename C>
    concept Container  = requires (C c){
        {c.begin()};
        {c.end()};
        {c.size()} -> std::same_as<size_t>;
    };

    // constraints version
    auto ofind2(Container auto& container, const auto& value) …
Run Code Online (Sandbox Code Playgroud)

c++ c++-concepts c++20

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

为什么某些 C++ 功能测试宏需要包含头文件?

一些 C++功能测试宏(例如__cpp_lib_three_way_comparison)需要包含头文件(例如<compare>)来测试它们。

这似乎很倒退,例如,也许我只想在我知道编译器支持它时才包含头文件(更准确地说,它使用的是编译器+std lib impl),例如,假设我有my_fancy_string_view并且我想将它定义为std::string_view如果std::string_view可用,但是检测是否std::string_view可用我需要包括<string_view>...

这只是此功能设计中的“错误/oopsie”,还是编译器未预定义所有功能测试宏的充分理由?我的猜测是可能允许混合 STL 实现,例如某些平台上的 clang 使用 gcc 的 std lib 实现,但我再次假设编译器知道他们使用什么 std lib 实现,因此他们可以调整预定义的宏。

我知道<version>标头存在,但这对我没有帮助,因为它仅在 C++20 中添加。当我的基线是 C++20 时,它可能在 10 多年后很好,但现在它不是那么有用。
此外,添加此标题的事实可能表明实际上需要“重”包含是一个错误,但我想就此获得专家意见。

PS是添加的提案<version>,但它非常小,所以没有细节......

c++ c++20

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

使用 fmt 格式化范围而不用 [] 括号括起来

我想使用分隔符打印一系列值,,但不[]使用 fmt 库。

如果我尝试打印出这样的范围

std::vector v {8,4,7,2};
std::cout  << fmt::format("{}",v) <<"\n";
Run Code Online (Sandbox Code Playgroud)

输出是

[8,4,7,2]

但我实际上希望输出是

8, 4, 7, 2

我怎样才能做到这一点?


我发现的一种方法是执行以下操作

std::cout  << fmt::format("{}",fmt::join(v,", ")) <<"\n";  
Run Code Online (Sandbox Code Playgroud)

这确实有效。然而,它很冗长,并且它对 fmt 进行了 2 次调用,这是我想避免的。这可能吗?

演示

另外,由于性能和可读性原因,我对[]从 fmt 生成的字符串中删除不感兴趣。

c++ c++20 fmt

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

是否有“需要”替代“void_t”?

void_t是一个很好的技巧来检测某些表达式的编译性,但我想知道是否有某种方法可以使用(或需要 require )进行检查,因为从可读性的角度来看,requires我真的不喜欢。void_t

例如,对于某种类型,我想检查某些表达式是否良好(即可编译),包括否定。

理想情况下,我希望这能起作用,但事实并非如此,可能是因为 lambda 不是模板化的......

#include <unordered_set>


int main() {
    auto a = []() requires requires(int x) {x<x;} {};
    auto b = []() requires !requires(std::unordered_set<int> x) {x<x;} {};
}
Run Code Online (Sandbox Code Playgroud)

如果这种用法看起来很奇怪,我真正的动机是检查某些内容是否无法编译,例如我的非模板类型没有operator<或者它不能从int或构建...

PS:我知道boost::hana办法做到这一点,我正在寻找普通的 C++20 解决方案。

c++ c++-concepts c++20

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

有没有std :: to_u16string或std :: to_u32string?

我很高兴标准库能够获得一个to_string功能,但现在我处于WTF模式.首先,为什么不是这个模板,其次如果它不是返回值的模板那么为什么在世界上他们没有to_u16string()to_u32string()功能.

我知道有提升词法演员,但我很想知道是否有一种标准的方法来获得我想要的东西而无需手动编写这些功能?

编辑:使事情更糟糕的提升1.46也不喜欢u16string :(

boost::lexical_cast<u16string>(22.44);
Run Code Online (Sandbox Code Playgroud)

在抛出'boost :: exception_detail :: clone_impl的实例后终止调用

'what():错误的词法转换:源类型值无法解释为目标

c++ tostring c++11

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

有没有办法声明函数的输入参数必须是const引用?

这样做的动机是(很少)我需要知道类构造函数或函数的输入参数通常是const.通常当类是帮助程序"自动化"某些过程时.
示例:
这是从容器中获取随机元素的OK范围方法吗?
如果查看代码,很明显,如果更改传递给构造函数的容器,则以后类功能会被破坏.那么有没有办法让函数"需求"const而不是"promise"const.

例:

int f(const vector<int>& v)
{
    return v.size();
}
int main()
{
    vector<int> v;
    v.push_back(42); // can f be changed to reject v because it is not const 
    cout << f(v);

}
Run Code Online (Sandbox Code Playgroud)

c++ const

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

调用sizeof(*s.begin())安全吗?

在做一些TMP :) :(我最终需要STL容器所持有的元素的大小.我知道通常deref一个container.begin()迭代器是坏的,不检查容器是否为空,但从我所知的sizeof是编译时宏,所以我它是安全的.我说对了吗?

代码段是:

    for(auto it = t.begin(); it!= t.end(); ++it)
    {
        char* cp = (char*)(&(*it));
        for (size_t i =0 ; i < sizeof *t.begin();++i)
        //...
    }
Run Code Online (Sandbox Code Playgroud)

c++ sizeof

0
推荐指数
2
解决办法
117
查看次数

如何获取整数模板参数的值?

标题可能会令人困惑,但我可以说我有一个模板:

template <typename T, size_t offset>
struct offsetedIdxArray
{
//...
}
Run Code Online (Sandbox Code Playgroud)

在我创建一个实例后:

static const size_t offset(1701);
offsetedIdxArray<zmq::socket_t, offset> oia;
Run Code Online (Sandbox Code Playgroud)

有没有办法从中获取偏移变量oia.我知道我可以使用偏移但是从代码风格的角度来看,oia如果可能的话,我更愿意从中获取它.

编辑:我正在寻找一种方法来获得偏移没有辅助变量在结构内...

c++ templates

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

有没有办法防止在编译期间使用未实现的函数?

经常我遇到像黑客一样的黑客

//lets say this is some class that still doesnt support...
//...all the functionality that it should based on the design docs
void MyClass::MyFunction()
{
  throw std::exception("not implemented");
}
Run Code Online (Sandbox Code Playgroud)

我想这是一个不好的做法,但除此之外:
有没有办法在编译期间做同样的事情,但只有在使用函数时(如果它是未使用的编译应该成功).

编辑:我也对虚拟内存功能感兴趣.

c++ compile-time

0
推荐指数
2
解决办法
4041
查看次数

标签 统计

c++ ×10

c++20 ×4

c++-concepts ×2

c++11 ×1

compile-time ×1

const ×1

eigen ×1

fmt ×1

sizeof ×1

templates ×1

tostring ×1