给出:
template <typename T1>
struct Foo {};
和:
template <typename T2>
void bar(const T2&) {}
我想在bar
中添加静态断言,以确保它仅在T2
为Foo<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
本身内部的不兼容使用,但是我更喜欢更明确的约束。