我想要使用helper struct和constepxr函數檢查某些模板參數的有效性時遇到問題。只要沒有引用靜態constexpr成員,我想初始化編譯器決定不評估表達式。我使用的代碼如下:constexpr靜態成員的強制評估
#include <cstddef>
#include <iostream>
#define CONSTEXPR static constexpr
using namespace std;
template<size_t ... Sizes>
struct _size_check_impl
{
static_assert(sizeof...(Sizes) != 0, "Dimension has to be at least 1");
CONSTEXPR size_t dimension = sizeof...(Sizes);
};
template<size_t ... Sizes>
constexpr size_t check_sizes()
{
return _size_check_impl<Sizes...>::dimension;
}
template<size_t ... Sizes>
struct Test
{
static constexpr size_t Final = check_sizes<Sizes...>();
};
int main()
{
Test<> a; // This shouldn't get through the static assert
Test<1, 2> b; // Passing
Test<2> c; // Passing
// cout << Test<>::Final; // With this it works just fine, bc Final is accessed
return 0;
}
有沒有一種方法,我可以做到這一點,一些代理dependecy迫使編譯器,如果constexpr進行評估,以評估值Final
?有沒有另一種乾淨的方式來檢查這個屬性乾淨,快速?
原因是靜態斷言取決於'Sizes ...'參數,該參數直到兩階段查找的階段2才被實例化。 – 0x499602D2
如果在任何地方使用'Test <...> :: Final',則會評估其值。如果沒有,它不會。那麼你不應該在乎它是否被評估。 –