小编nya*_*108的帖子

constexpr构造函数与编译时验证

我想建立一个可以选择constexpr-ness的课程.当然,我想利用编译时错误检查.

constexpr当给定参数不是常量表达式时,包含的每个函数(构造函数)也必须在运行时工作.这应该是为什么每次你使用的原因static_assertconstexpr功能后,它无法编译函数参数.

这样说,我已经读过,可以使用抛出mechnanism的异常,因为当函数被调用为常量表达式时,可以在编译时评估这些异常.如果可行,那么对于功能问题就解决了.

但是问题仍然没有解决构造函数,因为constexpr构造函数似乎必须没有正文......所以看起来我不能从那里使用异常抛出!

任何的想法?

c++ constexpr c++11

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

为什么STL中没有常量表达式字符串构造函数?

似乎在 C++ 中,在静态内存中完全拥有字符串文字的唯一方法是将它们声明为:

class A
{
    static const char const * = "Hello World";
};
Run Code Online (Sandbox Code Playgroud)

我注意到std::string没有常量表达式构造函数。我知道std::string实现基于动态分配,但为什么没有另一个符合std::string 的字符串类可以完成这项工作?

c++ string stl constexpr c++11

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

基于C++策略的设计

在Alexandrescu 基于策略的设计中我不理解的是创建没有任何共同点的新类型,在我看来,仍然存在许多应该以某种方式表示的共同点.

例如,std::stringstd::basic_string<>:allocator是非常内部的东西,在我看来,使用该类的代码不应该知道该类正在使用哪个分配器.

但是,因为已经创建了一个新类型,所以std::basic_string_1,所有那些传递的std::string&方法基本上都被破坏了,我看不出一个有效的理由,为什么std::basic_string<>不同的分配器被认为std::basic_string<>与另一个分配器完全不同.

我的问题是:为什么每个人都没有共同的父母std::basic_string<>,这样可以避免这个问题?一般在我的代码中,当我有一个Whatever<T>,我使它继承WhateverBase某种类型,当T它没有显示在该类的公共接口上时,它工作得非常好......

c++ string templates stdstring policy-based-design

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

如何在Modern C++中表达不依赖所有权的参与关系?

从"一个不应该使用原始指针"成语的角度出发,我正在寻找智能指针来找到哪一个最适合引用关系.

通过引用关系,我的意思与此代码相同:

class A
{
public:

    A(B & b) : 
        m_refB( b ) 
    {   }

private:

    B & m_refB;    // A refers to B
};
Run Code Online (Sandbox Code Playgroud)

但是没有使用引用的所有缺点(以后不能绑定,不能重新分配,A不能再默认构造等).

然而,每个智能指针以其自己的语义表达所有权概念.它们甚至以这种所有权概念命名(当所有权仅对一个对象是唯一的时,唯一指针,当所有权在更多对象之间共享时共享指针等).

我想表达的是A指的是B,但是A不拥有B.可以std::reference_wrapper< B >做这个工作,或者那是错误的用法吗?

c++ pointers reference smart-pointers

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

定义类型的成本/开销是多少?

在C++中定义了太多类型是否有任何运行时成本或开销?例如,这两段代码之间是否有任何区别:

int main()
{
    int x, y;
    double fx, fy;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

和:

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

int main()
{
    Point<int> p;
    Point<double> fp;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

想象一下具有许多模板化类型的代码,因此在编译时它会生成更具体的类型:它是否会在运行时产生任何影响?我主要担心的是静态内存消耗.

c++ types

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

哪个基类调用派生重写方法?

我有以下代码使用多重继承.目的是在派生类中使用两个接口作为一个接口:

struct InterfaceA
{
    virtual void register_stuff();
    virtual void on_state_changed( const State state ) = 0;
};

struct InterfaceB
{
    virtual void register_stuff();
    virtual void on_state_changed( const State state ) = 0;
};

struct Derived : InterfaceA, InterfaceB
{
    void register_stuff() override
    {
        InterfaceA::register_stuff();
        InterfaceB::register_stuff();
    }

    void on_state_changed( const State state ) override
    {
        // how can I know who is responding?
    }
};
Run Code Online (Sandbox Code Playgroud)

注册接口将导致异步调用on_state_changed.是否有可能辨别哪个接口正在调用它?

c++ overriding multiple-inheritance

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

std :: tie上的std :: invoke_result

我在C ++ 17上使用GCC 7.3,但我不明白为什么此行失败:

template <typename... Args>
using X = std::invoke_result<std::tie, Args...>::type;
Run Code Online (Sandbox Code Playgroud)

错误是:

error: type/value mismatch at argument 1 in template 
parameter list for ‘template<class _Functor, class ... _ArgTypes> 
struct std::invoke_result’
using X = std::invoke_result<std::tie, Args...>::type;
note:   expected a type, got ‘std::tie’
Run Code Online (Sandbox Code Playgroud)

c++ c++17

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

为什么 std::invocable 概念会阻止编译此代码

我不明白为什么std::invocable在以下代码中lambda 和函数都没有被识别为兼容类型:

#include <concepts>
#include <iostream>

void f( std::invocable auto callback)
{
    callback(47);
}

void function_callback(int i)
{
    std::cout << i << std::endl;
}

auto lambda_callback = [](int i )
{
    std::cout << i << std::endl;
};

int main(int) 
{
    f(&function_callback);
    f(lambda_callback);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用-std=c++2a启用了标志的GCC 主干。

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

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

PIMPL习语和复制语义

我正在使用一个库,其中包含许多使用PIMPL习语构建的类.在我看来,我发现不好的是,这些类是使用a std::shared_ptr实现的.这意味着对象实际上是"隐式共享"的.我的问题是:这是实施PIMPL的正确方法吗?或PIMPL和"隐式共享"是两种不同的习语,因此默认情况下不应该混合使用?处理复制语义的正确方法是什么?

c++ pimpl-idiom deep-copy

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

具有模板化函数作为参数的STL算法

如何将模板化函数STL提供的算法一起使用<algorithm>?例如,此代码无法编译,因为编译器无法推导出该predicate函数的模板参数:

#include <iostream>
#include <algorithm>

template< typename CharType >
bool predicate( const CharType& c )
{
    return c == '0';
}

std::string
process_string( const std::string& str )
{
    std::string result;
    std::copy_if( str.begin( ),
                  str.end( ),
                  std::back_inserter( result ),
                  predicate );
    return result;
}

int main()
{
    std::cout << process_string("AK0NNDK0ASDAS0") << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ stl-algorithm template-function c++11

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