小编0xb*_*00d的帖子

C++使用静态内联声明模板函数是否有意义?

我们没有'extern模板','模板'函数总是'隐式内联'.这还有意义吗?

c++ standards templates inline

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

STL容器库 - 在allocator类的不同实例上调用allocate/deallocate是否合法?

首先,我认为不是.但是,我在调试模式下观察到了MSVC 10.0的这种行为.我正在使用一个自定义allocator类,它依赖于用户只传递在同一个实例上分配的指针deallocate.但是,在发布模式下,我的代码正在运行.

这是一个错误还是我弄错了?

c++ containers stl allocator

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

在模板类中定义模板化的友元函数

为什么以下代码会产生编译器错误而没有命名模板make_static_vector

template<class Tuple>
class vector;

template<typename T, std::size_t N>
using static_vector = vector<std::array<T, N>>;

template<class Tuple>
class vector
{
private:
    using value_type = std::decay_t<decltype(std::declval<Tuple&>().operator[](0))>;

    template<typename T, typename... Elements>
    friend static_vector<T, sizeof...(Elements)> make_static_vector(Elements&&... elements) {
        return { std::forward<Elements>(elements)... };
    }

    template<typename... Elements>
    vector(Elements&&... elements)
        : m_elements{ static_cast<value_type>(std::forward<Elements>(elements))... }
    { }

    Tuple m_elements;
};

int main()
{
    make_static_vector<double>(1, 1);   
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已经创建了代码现场演示.当我移动make_static_vector类外部的定义并且只在类中留下声明部分时,它正在工作.

为什么不能直接在类中定义函数?

c++ templates friend c++14 c++17

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

如果每个参数都可以转换为特定类型,则启用ctor

foo每当有多个参数并且每个参数都可以转换为类型时,我想启用类的ctor value_type.我尝试过以下方法:

struct foo
{
    using value_type = /* some type */;

    template<class... Ts,
        std::enable_if_t<(sizeof...(Ts) > 0) && std::conjunction_v<std::is_convertible_v<Ts, value_type>...>, int> = 0>
    explicit foo(Ts&&... vs)
    {
    }
};
Run Code Online (Sandbox Code Playgroud)

假设foo::value_type = float.我试图声明foo bar{ 1 };并观察到ctor被禁用了.为了看看发生了什么,我std::conjunction_v从模板中删除了部分并添加了

static_assert(std::conjunction_v<std::is_convertible_v<Ts, value_type>...>, "");
Run Code Online (Sandbox Code Playgroud)

对身体.现在我的编译器(MSVC 14.1/Clang)产生错误

模板类型参数的模板参数必须是类型

static_assert(std::conjunction_v<std::is_convertible_v<Ts, value_type>...>, "");               
                             // ^
Run Code Online (Sandbox Code Playgroud)

这究竟是什么问题?c

c++ type-traits enable-if c++17

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

在容器中存储常量字符串文字

我有一个结构体和一个结构体foo bar,我想要一些成员字段的常量值,即struct foo { const char* s, ... };std::vector<foo> v;push_backfoos

bar.push_back({ "1", /*...*/ });
bar.push_back({ "2", /*...*/ });
bar.push_back({ "3", /*...*/ });
//...
Run Code Online (Sandbox Code Playgroud)

现在,如果我不是完全错了,这并不安全,因为字符串文字的生命周期受限于初始化大括号的范围。因此,字符串文字的生命周期"1"应该已经在第二行结束push_back

我们该如何处理?我们真的需要创建第二个容器 strongstd::string并将相应的c_str()指针传递给bar吗?

c++ string containers string-literals c++17

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

确定是否支持Web存储

我需要验证Web Storage API是否受支持并可用(由于安全问题,它可能已被禁用)。

因此,我认为检查是否定义了sessionStorage或localStorage类型就足够了:

if (typeof sessionStorage != 'undefined')
{
    alert('sessionStorage available');
}
else
{
    alert('sessionStorage not available');
}
Run Code Online (Sandbox Code Playgroud)

但是,我想知道这种类型是否可能存在,但无论如何我都无法使用Web Storage API。

备注:我知道,如果禁用cookie并访问sessionStorage或localStorage,Firefox将引发安全错误。

javascript session-storage local-storage web-storage

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

当为不同的迭代器和 init 类型调用 std::reduce 时,Visual Studio 中出现编译器错误

请考虑以下简单的代码片段:

template<typename T>
struct point2{ T x, y; };

template<typename T>
std::complex<T> foo(std::vector<point2<T>> const& x)
{
    std::reduce(std::execution::par_unseq, x.begin(), x.end(), std::complex<T>{},
        [&](std::complex<T> const& first, point2<T> const& second) {
            return first + std::complex<T>{ second.x, second.y };
        });
}
Run Code Online (Sandbox Code Playgroud)

使用 Visual Studio 2022(C++ 语言设置为 C++20)时,我收到错误消息

'int foo::<lambda_1>::operator ()(const std::complex &,const point2 &) const': 无法将参数 2 从 'std::complex' 转换为 'const point2 &'

这里出了什么问题?定义中的迭代器指向的类型似乎std::reduce需要与所选的初始值相同。但这似乎不是 C++ 标准中描述的要求。我错过了什么吗?

c++ reduce c++20

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

我们可以将“Eigen::Vector&lt;T, D + 1&gt;&amp; x”重新解释转换为“Eigen::Vector&lt;T, D&gt;&amp;”,以从“x”中提取第一个“D”分量吗?

我需要计算D维函数的函数值和梯度并将这些值加在一起。D我认为简单地将梯度部分存储在第一个分量中并将函数值存储在D+1维向量的最后一个分量中将是有益于计算的。

但是,如何从该维向量中提取第一个D分量(即梯度部分) ?D+1我知道可以选择切片,但我不想在这里添加任何无意义的开销。所以,我尝试简单地reinterpret_cast<Eigen::Vector<T, D>&>在我的上做一个Eigen::Vector<T, D + 1>并且它起作用了;但这真的能保证有效(并且安全)吗?

c++ reinterpret-cast eigen c++20

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