我有一个类/结构体模板,长这样:
template <typename T, typename U>
struct S
{
unsigned int operator()(T t, U u) const;
};
我希望确保专业化遵守这个接口。
不幸的是,我可以使用不同的返回类型对此结构进行专业化。例如,如果我部分地专门返回bool
而不是unsigned int
,我希望得到编译器错误,但编译器似乎并不关心:
template <typename T>
struct S<T,nullptr_t>
{
bool operator()(T t, nullptr_t u) const { return 2; }
};
Example @ Ideone.com
在上面的示例中,专用版本应该返回2
,但由于返回类型是bool
,返回值被转换为true
,然后显示为1
。编译器为什么会接受这种情况?
如何防止程序员使用错误的返回类型(甚至使用错误的参数)对模板进行特化?
我知道我可以在基础模板类/结构中使用虚方法并在子类中使用
override
关键字来实现我想要的效果:
使用override的解决方案(不能编译,这很好)
但是使用虚方法肯定会创建一个虚表,并且我尽可能避免这样做,特别是因为我不需要运行时的虚表。除非有一个技巧可以在不建立虚表的情况下实现相同的功能?此外,我知道如果我能够部分特化方法或者依赖于非部分特化的话,问题会更简单,但是据我所知前者在C++中不可能实现,后者也无法涵盖我在程序中需要的情况。
decltype
或std::result_of
),但这意味着每个调用者都需要检查它或每个特化都需要检查它,这有点重。也许我可以使用C++20的概念使该检查自动化,但我的编译器不兼容C++20。 - vdavid