局部类型在未实例化的函数中作为模板参数
Local type as template argument inside not instantiated function
局部类型作为模板参数在c++ 03中被禁止:
template<typename T>
struct Foo { };
void Make()
{
struct Unknown {};
Foo<Unknown> foo; // Bad
}
在模板没有实例化的情况下,标准中是否有关于检查此规则的指令?
是否有可能确定,仅在模板实例化尝试(没有实例化=>编译成功)之后才检查此规则?
template<typename T>
struct Foo { };
template<typename T>
void Do(T&) { }
template<typename T>
void Do(T*) // usage with pointer is forbidden by-design
{
struct Unknown {};
Foo<Unknown>::UnknownMethod();
}
int main()
{
std::string s;
Do(s);
}
在c++ 03中没有这样的指令,因为
- 在c++ 03和中没有指令
- 规则没有说用本地类型作为参数实例化模板是错误的,它说使用本地类型作为模板参数是错误的。
如果模板没有实例化,则不应该是成功的。
另一方面,一些编译器允许局部类型作为模板形参(例如Visual c++;不,它不符合标准,但这就是生活),所以你不能用它来强制编译失败。
如果在尝试某些组合时需要编译失败,请使用标准的静态断言。你可以使用Boost。静态Assert的实现,在注释中由π α ντα ρ ε ε连接的实现或在这个其他问题/答案1
中的简单实现template<typename T>
struct Foo { };
template<typename T>
void Do(T&) { }
template<typename T>
void Do(T*) // usage with pointer is forbidden by-design
{
BOOST_STATIC_ASSERT(false);
}
1我不确定它是否正确;我认为即使没有实例化,实现也可能失败,除非参数在封闭模板中依赖于参数。
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类