C++ 确保是否发出特定代码

C++ 确保是否发出特定代码,c++,c++11,gcc,clang,static-if,C++,C++11,Gcc,Clang,Static If,如何确保未发出某些特定代码 比如说,我试着写一些东西,比如静态开关或静态if,我希望检测第二个lambda操作符的身体是否被发射: #include <type_traits> namespace details { template< typename visitor, typename ...visitors > struct composite_visitor : std::decay_t< visitor > , c

如何确保未发出某些特定代码

比如说,我试着写一些东西,比如静态开关或静态if,我希望检测第二个lambda操作符的身体是否被发射:

#include <type_traits>

namespace details
{

template< typename visitor, typename ...visitors >
struct composite_visitor
        : std::decay_t< visitor >
        , composite_visitor< visitors... >
{

    using std::decay_t< visitor >::operator ();
    using composite_visitor< visitors... >::operator ();

    composite_visitor(visitor & _visitor, visitors &... _visitors)
        : std::decay_t< visitor >(std::forward< visitor >(_visitor))
        , composite_visitor< visitors... >{_visitors...}
    { ; }

};

template< typename visitor >
struct composite_visitor< visitor >
        : std::decay_t< visitor >
{

    using std::decay_t< visitor >::operator ();

    composite_visitor(visitor & _visitor)
        : std::decay_t< visitor >(std::forward< visitor >(_visitor))
    { ; }

};

}

template< typename visitor, typename ...visitors >
details::composite_visitor< visitor, visitors... >
compose_visitors(visitor && _visitor, visitors &&... _visitors)
{
    return {_visitor, _visitors...};
}

#include <iostream>

#include <cstdlib>

template< int condition >
void
test()
{
    compose_visitors(
        [] (std::integral_constant< int, 0 >) { std::cout << 0 << std::endl; },
        [&] (std::integral_constant< int, 1 >) { std::cout << 1 << std::endl; },
        [] (std::integral_constant< int, 2 >) { std::cout << 2 << std::endl; }
    )(std::integral_constant< int, condition >{});
}

int
main()
{ 
    test< 0 >();
    //test< 1 >();
    test< 2 >();
    return EXIT_SUCCESS;
}
有什么技巧可以让我在生成的二进制文件/.o/.a中检测到特定代码块的存在

以前,可以对GCC执行以下操作:

将-Wa,-adhlns=$@.lst添加到CXXFLAGS; 添加asm挥发性nop;语句到要测试的代码块; 构建,然后运行awk/\APP/,/\NO_APP/build/*.lst而不是hash symbol。可能有一个斜杠命令,用于将内联程序集查看到构建目录中的*.lst文件中; 如果awk打印某些内容,则会发出特定的代码块。
但我使用了clang,因此不能使用-Wa编译器参数。什么是叮当声?我知道我可以使用-S编译器选项发出汇编文件.S,但在大型项目中,如果在构建过程中存在依赖链,则很难以这种方式执行。除了.o文件外,如何发出程序集?

Hm,为什么不从有趣的代码块中调用已定义但未实现的函数?如果发出代码,您将收到链接错误?@user1034749所有可能的方法都是允许的。我想知道他们所有人;。我认为我的版本至少有一个优点:它允许检测特定函数模板或模板类的特定成员函数模板的所有实例化。您可以使用模板定义的未实现函数,模板参数针对您,例如从哪个类调用函数,当报告错误时,链接器告诉我们这个未实现的函数是从哪个类调用的。我想你的意思是省略了?省略是省略了什么,发射是释放什么,通常是气体或信号。你指的是哪一个?