小编Mam*_*ita的帖子

区分接受与函数参数同名的常量和非常量参数的函数引用/指针

让我们考虑两个具有相同名称的函数:

int func(int&)
{
    return 7;
}
int func(const int&)
{
    return 5;
}
Run Code Online (Sandbox Code Playgroud)

让我们int mutableValue = 5在某处定义。是否有可能是模板函数call在call(mutableValue, func)将只需要int func(int&)?我不想使用static_cast<int(&)(int&)>- 因为它太吵了。

幼稚的实现:

template<typename Arg, typename Ret>
void call(Arg& val, Ret (&fun)(Arg&))
{
    fun(val);
}
Run Code Online (Sandbox Code Playgroud)

适用于 gcc,但不适用于 clang - 解决方案必须适用于两个编译器。

只接受const Arg&很容易。删除const Arg&过载无济于事。

c++ templates metaprogramming

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

使用内部类与CRTP

是否有可能使用CRTP的内部类或枚举?防爆.

template<typename Container>
struct ContainerBase
{
    std::map<typename Container::Enum, int> _;
};
struct ConcreteContainer : ContainerBase<ConcreteContainer>
{
    enum class Enum
    {
        left,
        right
    };
};
Run Code Online (Sandbox Code Playgroud)

c++ crtp

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

为什么flat_set和flat_map不是ContiguousRange?

是否故意(缺少data()成员函数)完成?它可以防止腐烂从flat_set/ flat_map到std::span,如果我们汤治疗可能很有用flat_set/ flat_map作为排序vector。

这样行事安全吗?

template<typename T>
std::span<const T> make_span(const std::flat_set<T>& fset)
{
    return std::span<const T>{fset.empty() ? nullptr : std::addressof(*fset.begin()),
                              fset.size()};
}
Run Code Online (Sandbox Code Playgroud)

c++ templates c++20

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

标签 统计

c++ ×3

templates ×2

c++20 ×1

crtp ×1

metaprogramming ×1