我想创建一个只接受某些类型参数的模板。对于所有剩余类型,我希望产生编译时错误消息。所以我写了下面的如何约束模板参数
------ 1版------
template <typename T_,bool isError = true>
struct Error {
static_assert(!isError, "Invalid Type");
};
template <typename T_>
struct Wrapper : Error <T_> {
private:
T_ value_;
};
template <>
struct Wrapper<int> : Error<int, false> {
private:
int value_;
};
int main()
{
Wrapper<int> wi;
Wrapper<long> wl; // I get the Invalid Type.
}
因为我没有使用类型参数T_
我删除它和代码停止工作。
------第2版------
template <bool isError = true>
struct Error {
static_assert(!isError, "Invalid Type");
};
template <typename T_>
struct Wrapper : Error <> {
private:
T_ value_;
};
template <>
struct Wrapper<int> : Error<false> {
private:
int value_;
};
int main()
{
Wrapper<int> wi; // I get Invalid type ?????
Wrapper<long> wl; // I get the Invalid Type.
}
我的问题是。为什么在删除类型参数后发生这种情况?这个解决方案是否“干净”?或者存在更好的方式来实现我的意图?
你即使没有遇到错误'无线/ wl'。因为'Error*true*/>'被实例化。 – Jarod42
当你移除'T_'时,''Wrapper''模板的基类'Error <>'不再依赖于模板参数,所以它不需要实例化'Wrapper'本身。正如Joard指出的那样,即使你有一个空的'main',你也会遇到错误。 –
Praetorian