如何确保模板参数是非常量和非引用

How to ensure template parameter is non-const and non-reference

通常(大部分时间?)在使用模板类型参数创建类型时,您希望确保类型参数填充为非引用、非限定(非 const、非易失性)类型。但是,像下面这样的简单定义允许用户为 T:

填写任何类型
template <typename T>
class MyContainer {
    T* whatever;
    T moreStuff;
};

现代 C++ 的概念应该能够解决这个问题。执行此操作的最佳(最好是最少样板式)方法是什么?

static_assert 是一个不错的选择:

#include <type_traits>

template <typename T>
class MyContainer
{
    static_assert(!std::is_reference_v<T>);
    static_assert(!std::is_const_v<T>);
    static_assert(!std::is_volatile_v<T>);

    T* whatever;
    T moreStuff;
};

您可以通过static_assert like

查看类型
template <typename T>
class MyContainer {
    static_assert(std::is_same_v<std::remove_cv_t<std::remove_reference_t<T>>, T>, "T must be non-reference, unqualified type");
    T* whatever;
    T moreStuff;
};

我会为此使用一个概念。

template <typename T>
concept cvref_unqualified = std::is_same_v<std::remove_cvref_t<T>, T>;
template <cvref_unqualified T>
class MyContainer {...};