有没有一种快速的方法来确定类是否是特定模板的专业化?

时间:2018-10-18 10:17:35

标签: c++ templates c++17

给出:

template <typename T1>
struct Foo {};

和:

template <typename T2>
void bar(const T2&) {}

我想在bar中添加静态断言,以确保它仅在T2Foo<T1>时起作用。

我意识到我可以这样做:

template <typename T1>
void bar(const Foo<T1>&) {}

但是,实际上Foo的模板参数列表要长一些,即使出于“逻辑”原因,我还是更希望避免在定义了bar的地方再次写出来

为此创建一个特征有多容易?

template <typename T2>
void bar(const T2&)
{
   static_assert(is_specialisation_of_v<Foo, T2>, "Only valid for kinds of Foo!");
}

我发现很难为这种特征拼写一个定义。

int main()
{
    Foo<int> f;
    bar(f);      // OK

    char c;
    bar(c);      // Should assert
}

我认为通常的想法是,由此产生的错误应该来自bar本身内部的不兼容使用,但是我更喜欢更明确的约束。

0 个答案:

没有答案