让我们考虑两个具有相同名称的函数:
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&过载无济于事。
是否有可能使用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) 是否故意(缺少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)