标签: tag-dispatching

在C++中使用enum而不是struct进行标签分派

让我们std::unique_lock从标准库中实现:

struct defer_lock_t { explicit defer_lock_t() = default; };
struct try_to_lock_t { explicit try_to_lock_t() = default; };
struct adopt_lock_t { explicit adopt_lock_t() = default; };

inline constexpr defer_lock_t  defer_lock {};
inline constexpr try_to_lock_t try_to_lock {};
inline constexpr adopt_lock_t  adopt_lock {};

unique_lock (mutex_type& m, defer_lock_t t) noexcept;
unique_lock (mutex_type& m, try_to_lock_t t);
unique_lock (mutex_type& m, adopt_lock_t t);
Run Code Online (Sandbox Code Playgroud)

是否有人不会/不能/不应该使用枚举而不是结构来实现标签调度?如:

enum defer_lock_t { defer_lock };
enum try_to_lock_t { try_to_lock };
enum adopt_lock_t { adopt_lock };

unique_lock (mutex_type& m, defer_lock_t t) noexcept; …
Run Code Online (Sandbox Code Playgroud)

c++ c++17 tag-dispatching

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

SFINAE和标签分发之间的区别

在此视频中,https: //youtu.be/Vkck4EU2lOU?t = 582展示了“标签分发”和SFINAE作为替代方案,使您可以选择所需的模板功能。

这是对的吗?不是使用SFINAE进行“标签分配”吗?如果正确,那么SFINAE和代码分发之间到底有什么区别?

c++ templates sfinae tag-dispatching

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

在 constexpr 分支中使用枚举类值

下面的代码会val2在两次f()调用中打印。f()根据枚举值执行特定分支的正确方法是什么?

enum class E
{
    val1,
    val2
};

using val1_t = std::integral_constant<E, E::val1>;
using val2_t = std::integral_constant<E, E::val2>;
    

template <typename T>
void f(T t)
{
    if constexpr (std::is_same_v<T, val1_t>)
    {
        std::cerr << "val1\n";
    }
    else
    {
        std::cerr << "val2\n";
    }
}


int main()
{
    f(E::val1);
    f(E::val2);
}
Run Code Online (Sandbox Code Playgroud)

c++ enums constexpr c++17 tag-dispatching

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

标签 统计

c++ ×3

tag-dispatching ×3

c++17 ×2

constexpr ×1

enums ×1

sfinae ×1

templates ×1