我正在学习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) 我已将 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) 我正在尝试使用带有-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++ 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)