我刚刚升级了我的msvc,遇到了麻烦。
以下是在我的旧代码中重现问题的最小完全可验证示例:
#include <functional>
#define VERSION 1
template<typename T>
class Foo
{
public:
static constexpr int bar = 512;
#if VERSION == 1
Foo(std::function<int()> f = []() { return Foo<T>::bar;})
#elif VERSION == 2
Foo(std::function<int()> f = []() { return Foo::bar;})
#elif VERSION == 3
Foo(std::function<int()> f = []() { return bar;})
#elif VERSION == 4
Foo(std::function<int()> f = [bar = Foo<T>::bar]() { return bar;})
#endif
: m_f{std::move(f)}
{}
public:
std::function<int()> m_f;
};
void use()
{
Foo<int> foo;
}
现场演示
当VERSION
被定义为1
时,这与我的原始代码类似。我还要支持clang和gcc。我的项目经常使用C++17标准(我的项目可能在未来一两年使用C++20(。
我正在寻找一些不错的解决方案,它不需要讨厌的#if
,并涵盖所有编译器(新旧msvc
gcc
clang
(。
VERSION
的其他值展示了我迄今为止所做的尝试(某些编译器总是失败(。
VERSION | 哪些编译器失败 |
---|---|
1 | msvc 19.28 |
2 | msvc 19.28、msvc 19.27、msvc 19.55 |
3 | msvc所有版本 |
4 | clang 11.0 |
静态函数完成以下工作:
static std::function<int()> defaultF() {return []() { return bar;};}
Foo(std::function<int()> f = defaultF())
: m_f{std::move(f)}
{}
演示