Sam*_*rsa 5 c++ templates visual-c++-2008
我有很多模板代码.由于坏的模板代码不会抛出编译器错误,除非它被编译,有什么方法可以检查编译器实际上"编译"哪些模板函数,哪些被完全忽略?
编辑2:
如果特定的类模板或函数模板被实例化一次,对于任何参数类型,那就没问题.我想要从未以任何形式实例化的函数/类模板列表.
一个特定的例子如下.它们是两个不同的模板函数,我想知道其中一个或两个是否从未实例化.
template <typename T_InputItr, typename T_Distance>
void advance( T_InputItr& aItr, T_Distance aN, bidirectional_iterator_tag )
template <typename T_InputItr, typename T_Distance>
void advance( T_InputItr& aItr, T_Distance aN, random_access_iterator_tag )
Run Code Online (Sandbox Code Playgroud)
编辑:目前,对于类,我在.cpp文件中手动实例化它们,如下所示:
template TClass<int>;
Run Code Online (Sandbox Code Playgroud)
对于我感兴趣的所有类型.这很好,很好.但那就是我记得那样做的.有时我需要编写很多小模板类/函数,我忘记手动实例化一些函数/类模板,然后在后面找出.我想编译器告诉我.
或者,如果我可以获得实例化的函数/类模板列表(对于任何参数),那么我可以将它与我可能在代码中grep的完整列表进行比较.
另一个好处是"测试"在模板类中编译哪些方法,该模板类使用类型特征来有选择地编译出某些函数.在继续之前,我想确定我选择正确功能的逻辑是否正确.
有人提到“一切都可以通过添加间接级别来解决” - 您可以向每个函数添加静态断言并观察编译失败:
template <typename T>
struct Asserter
{
static const bool value = false;
};
template <typename T>
struct Foo
{
void foo()
{
static_assert(Asserter<T>::value, "Foo::foo() is being compiled.");
}
void bar()
{
static_assert(Asserter<T>::value, "Foo::bar() is being compiled.");
}
};
int main()
{
Foo<int> f;
//f.foo(); // static assertion!
}
Run Code Online (Sandbox Code Playgroud)
如果您不希望编译在每一步都中断,您可以发出Boost static warning或具有类似效果的警告。
| 归档时间: |
|
| 查看次数: |
271 次 |
| 最近记录: |