如何约束模板参数
How to constrain template parameters
我想创建一个仅接受某些类型参数的模板。对于所有剩余类型,我希望产生编译时错误消息。所以我写了以下
-------版本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.
}
我的问题是。为什么在删除类型参数后会发生这种情况?该解决方案是"干净"吗?还是有更好的方法来实现我的意图?
一旦有:
template <typename T_>
struct Wrapper : Error <> {
private:
T_ value_;
};
我们可以看到Error<>
已完全指定(即,所有模板参数均已知道),这与在仍然依赖的位置不同。因此,编译器实际上会继续并无条件实例化Error<>
,这意味着此代码永远不会编译(即使根本没有提及Wrapper
)。当Error
仍然依赖T
时,它是一种依赖类型,因此仅当Wrapper<T>
需要它的情况下是由情况实例化的。
我可能会以不同的方式分开特征:
template <class T>
struct my_trait : std::false_type {};
template <>
struct my_trait<int> : std::true_type {};
template <class T>
struct Wrapper {
static_assert(my_trait<T>::value, "");
};
int main()
{
Wrapper<int> wi;
Wrapper<long> wl; // I get the Invalid Type.
}
如果您真的想重复使用错误消息,则可以做类似的事情:
template <typename T>
struct Error {
static_assert(my_trait<T>::value, "Invalid Type");
};
template <class T>
struct Wrapper {
static constexpr auto unused = Error<T>{};
};
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 函数作为模板参数,是否对返回类型强制约束
- 如何将从第 2 个字符开始的字符串作为函数中的参数传递以进行递归,并约束数据 tiee 是函数中的字符串?
- 带有约束的可变参数模板的'requires'表达式的语法是什么?
- 将约束组合应用于参数包
- 约束模板参数顺序的更简单方法
- 如何约束参数类型以仅允许 std::initializer_list<size_t> 或 std::array<size_t, N>?
- 约束类型模板参数仅对特定模板进行实例化
- 约束模板参数取决于传递的函子
- 如何在C++17中强制执行模板和模板模板参数之间的约束
- 如何约束模板参数
- 对参数生存期的约束 std::regex_match(和 std::regex_search)
- 作为模板参数的可调用类型上的C++约束
- 如何对构造函数的参数进行约束
- 链接的模板模板参数-将内部参数约束为相同
- 如何约束模板参数以符合std::map中的Key
- 使用noexcept作为lambda修饰符或参数约束
- 带有auto特性的c++ 17模板参数是否允许约束std::函数对象?
- 模板参数的条件数值约束