What is the best way to create a specialization-only function template?

前端 未结 2 1351
迷失自我
迷失自我 2021-02-14 19:38

Is there a better way to do the following?

#include 

template 
T Bar();

template <>
int Bar() { return 3; }
         


        
2条回答
  •  逝去的感伤
    2021-02-14 20:02

    BOOST_STATIC_ASSERT(sizeof(T) == 0); isn't allowed to fail until the template is instantiated, so I would just do that one. You are correct that BOOST_STATIC_ASSERT(false); triggers each time.


    The reason for this has to do with two-phase name lookup. This is, essentially, the following: when a template is compiled, it's compiled twice. The first time a compielr sees a template it compiles everything except the expressions dependent on template parameters, and the second compilation happens once the template parameter is known, compiling the instantiation fully.

    This is why BOOST_STATIC_ASSERT(false); will fail always: nothing here is dependent and the assert is processed immediately, as if the function weren't a template at all. (Note that MSVC does not implement two-phase look-up, so this fails at instantiation, incorrectly.) Contrarily, because T is dependent (§14.6.2.1), BOOST_STATIC_ASSERT(sizeof(T) == 0); is dependent, and is not allowed to be checked until the template is instantiated. (Where upon it will always fail.)

    If a compiler tries to be thoughtful and fail it ahead of time, it would be non-conforming. You're suppose to be able to rely on this stuff. That said, if fear gets the best of you it's trivial to really make it wait:

    BOOST_STATIC_ASSERT(sizeof(typename T::please_use_specializations) == 0);
    

    This is both guaranteed to fail, and impossible for a compiler to correctly "smartly" fail ahead of time.

提交回复
热议问题