诸如Allocator之类的一些命名要求希望您实现通用的方法,例如Allocator::allocate(int n)
。对于我的特定情况,我只想实现参数n=1
,如果可能,我会在编译时失败(如果提供了其他整数)。
到目前为止,我还没有找到任何可靠的解决方案。我只关心GCC和Clang。
这在GCC中可以正常工作,但在Clang(Godbolt)中却不能:
struct OneAndOnlyOne {
constexpr OneAndOnlyOne(int v) noexcept {
// static link-time error in Clang for any value of v unless -O2 is supplied:
if (v != 1) _you_must_supply_a_one();
}
private:
void _you_must_supply_a_one();
};
assert使它成为运行时问题(Godbolt):
struct OneAndOnlyOne {
constexpr OneAndOnlyOne(int v) noexcept {
// fails only at runtime:
assert(v == 1);
(void) v;
}
};
static_assert不起作用,或者:({Godbolt):
struct OneAndOnlyOne {
constexpr OneAndOnlyOne(int v) noexcept {
// "error: 'v' is not a constant expression"
static_assert(v == 1);
}
};
似乎没有技巧将参数转换为模板参数(Godbolt):
template <int> struct FailUnlessOne;
template <> struct FailUnlessOne <1> {};
struct OneAndOnlyOne {
constexpr OneAndOnlyOne(int v) noexcept {
// "error: 'v' is not a constant expression"
constexpr FailUnlessOne<v> test;
(void) test;
}
};
是否有我忽略的东西,还是根本无法在编译时测试参数?