C++ C++;用于检查模板是否已使用特定类型实例化的静态断言

C++ C++;用于检查模板是否已使用特定类型实例化的静态断言,c++,templates,static-assert,C++,Templates,Static Assert,动机:我试图警告未来的维护人员,如果他们在代码中做了一些事情,他们必须确保也做了其他事情 请注意,这里的“实例化”是指模板实例化,而不是类实例化的对象。 class A; class B; template<class T> void foo() {} template<class T> class X {}; void f() { foo<A>(); } void g() { X<A> x; // ok X&l

动机:我试图警告未来的维护人员,如果他们在代码中做了一些事情,他们必须确保也做了其他事情

请注意,这里的“实例化”是指模板实例化,而不是类实例化的对象。

class A;
class B;

template<class T> void foo() {}
template<class T> class X {};

void f()
{
    foo<A>();   
}

void g()
{
    X<A> x; // ok
    X<B> y; // expecting static_assert here: if instantiated X with a type, 
            // foo must be instantiated with the same type too
}
A类;
乙级;;
模板void foo(){}
模板类X{};
void f()
{
foo();
}
void g()
{
X;//好的
xy;//此处应为静态_断言:如果使用类型实例化X,
//foo也必须用相同的类型实例化
}
关于您的评论:

任何组合都很好。。。是的,如果有帮助的话,我可以将函数封装在一个类中,但是我也找不到这样的解决方案

我真的看不出还有什么需要解决的

如果在模板类中有函数,如

template<typename T>
class X {
    static void foo() {
        // Do something involving T
    }
};
模板
X类{
静态void foo(){
//做一些涉及T的事情
}
};

已经保证
X
X::foo()
为同一类型实例化。

您自己已经尝试过了吗?是的,我试过做模板专门化,但失败的原因有两个:恐怕你不能用静态断言将两个不相关的模板结合起来。您不能将
foo()
集成到模板类中吗?例如,作为
static
member函数?是的,我尝试进行模板专门化,但失败的原因有两个:(1)如果我尝试引用模板实例的名称(如foo),这已经是实例化了。(2) 我应该在模板定义中将一些通常为false的东西专门化为true,但它位于另一个作用域
template struct\u实例化:std::false\u type{}
模板void foo(){
模板结构已实例化:std::true\u type{};
}
它们是1类1函数模板对我来说并不重要。任何组合都很好。。。是的,如果有帮助的话,我可以将函数封装在一个类中,但是我找不到这样的解决方案,也不能保证;专门化X并从专门化中省略foo。