小编Kon*_*kin的帖子

在一行中使用两个折叠表达式

我正在学习C++折叠表达式,他们非常适合扩展一个参数包.但是,如果我必须在一次通话中扩展其中一些呢?

我准备了一个例子来澄清我的意思:

#include <cstddef>
#include <iostream>
#include <utility>

template<
    template<size_t ix_, size_t iy_> typename Functor,
    typename FunctorContext,
    size_t... ix,
    size_t... iy>
void RepeatImpl(
    FunctorContext* context,
    std::index_sequence<ix...>,
    std::index_sequence<iy...>)
{
    (Functor<ix, iy>::Execute(context), ...);
}

template<
    template<size_t ix_, size_t iy_> typename Functor,
    size_t width, size_t height,
    typename FunctorContext>
void Repeat(FunctorContext* context)
{
    RepeatImpl<Functor>(
        context,
        std::make_index_sequence<width>(),
        std::make_index_sequence<height>());
}

template<size_t ix, size_t iy>
struct Init2dArrayFunctor
{
    template<typename T>
    static void Execute(T* array)
    {
        array[iy][ix] = 10;
    }
};

int main(int, const char**)
{
    constexpr size_t …
Run Code Online (Sandbox Code Playgroud)

c++ fold c++17

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

clang 18 和来自多个基础的运算符重载

我已将 clang 从版本 14 升级到最新版本(主干上为 18),看来我的代码中唯一的问题是来自多个基类的运算符继承(下面是对 godbolt 的示例和引用)。这是一个简化的示例,其中我有一个最终的向量类,它派生了一些添加功能的 mixin。在这种情况下,这些混合是向量-标量乘法和向量-向量乘法,以向量点积的形式实现。两种混合都会添加,operator*但是这两个运算符都专门用于处理特定类型的类型,因此不应该有任何歧义。到目前为止,这种方法运作良好。所以我的问题是 - 这个新错误是某些标准要求的实现还是这只是编译器测试版中的一个错误而我的代码没问题?

https://godbolt.org/z/ca8Yefjdc

#include <cstddef>
#include <type_traits>
#include <array>

template<
    typename T, size_t N,
    template <typename, size_t> typename FinalTemplate
>
struct VectorData
{
    std::array<T, N> data;
};

template<
    typename T, size_t N,
    template <typename, size_t> typename FinalTemplate
>
struct VectorScalarMultiplication
{
    using Final = FinalTemplate<T, N>;

    template<typename U, typename Enable = std::enable_if_t<(
        std::is_integral_v<U> || std::is_floating_point_v<U>
    )>>
    Final operator*(const U value) const
    {
        auto copy = static_cast<const Final&>(*this);
        for (size_t …
Run Code Online (Sandbox Code Playgroud)

c++ templates multiple-inheritance mixins clang++

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

带有CMake的LLVM地址清理器

我正在尝试使用带有-fsanitize = address选项的clang编译最简单的可执行文件。直接使用clang做到这一点非常简单。但是我的意思是通过CMake做到这一点。

我正在做这件事。CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.5.1 FATAL_ERROR)
project(TestSanitizer VERSION 0.1.0 LANGUAGES CXX)
add_executable(Test main.cpp)
target_compile_options(Test PUBLIC
    -std=c++17
    -Werror
    -Weverything
    -Wno-c++98-compat
    -Wno-c++98-c++11-c++14-compat
    -Wno-c++98-compat-pedantic
    -fsanitize=address)
Run Code Online (Sandbox Code Playgroud)

main.cpp:

int main(int, const char**) { return 0; }
Run Code Online (Sandbox Code Playgroud)

使用bash脚本(config_gen_build.sh)进行配置和制作:

if [ -d "bin" ]; then
    rm -rf bin
fi

mkdir bin
cd bin

#config and gen
export CC=/usr/bin/clang-5.0
export CXX=/usr/bin/clang++-5.0
cmake ./../

#build
make
Run Code Online (Sandbox Code Playgroud)

最后,我得到的错误是: 在此处输入图片说明

怎么了 我应该链接一些图书馆吗?

c++ cmake llvm-clang address-sanitizer

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

编译模板时出现clang错误

我试图触及C++ 17的功能,我选择了clang.这是我的代码的简化示例,无法通过clang编译:

#include <iostream>
#include <limits>

template<
    typename T,
    template<typename T_> typename Final>
class Base
{
public:
    decltype(auto) Foo() const noexcept
    {
        using TFinal = Final<T>;
        auto& _this = static_cast<const TFinal&>(*this);
        return _this.Bar<true>();
    }
};

template<typename T>
class Derived :
    public Base<T, ::Derived>
{
public:
    template<bool min>
    T Bar() const noexcept
    {
        return min ?
            std::numeric_limits<T>::lowest() :
            std::numeric_limits<T>::max();
    }
};

int main()
{
    Derived<int> instance;
    auto result = instance.Foo();
    std::cout << result << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它失败了:

return _this.Bar<true>(); …
Run Code Online (Sandbox Code Playgroud)

c++ templates clang clang++ c++17

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