如何在虚拟方法中围绕安装进行工作
How do I work around instaniation inside a virtual method?
我有一个可变类模板,它有一个虚拟函数。此函数使用一个Ts...
中的方法。
我希望仅在Ts...
具有baz()
的情况下实例化bar()
函数。当前编译器实例化该函数并报告一个错误,即x
没有函数baz()
。由于虚拟函数不能是模板,所以我无法将其分解。
template <class... Ts>
struct Foo
{
static constexpr auto I = 2;
virtual void bar()
{
auto x = std::get<I>(std::make_tuple(Ts::create()...));
x.baz();
}
};
有什么方法可以解决这个问题?我知道我可以通过将工作传递给派生Foo
的助手类来进行专门化,如果Ts...
具有baz()
,则将类型存储在基于条件进行专门化的元组中,但我不想引入另一种间接级别。还有其他选择吗?
更新:这是一个示例程序。
我将调用经典的"has member"技巧(原谅我,我忘了我第一次看到它的地方)。
我已经说服VS2013这是可以的:
template<typename T>
struct HazBaz
{
struct YesSir{char y[2];};
struct NoSir{char y;};
template<typename A>
static auto Frob(A &&a) ->
typename std::enable_if<
std::is_same<decltype(a.baz()), decltype(a.baz())>::value,
YesSir
>::type;
static NoSir Frob(...);
static const bool value =
sizeof(Frob(declval<T>())) == sizeof(YesSir);
};
template<typename T0, typename ...TN>
struct AllHazBaz
{
static const bool value =
HazBaz<T0>::value &&
AllHazBaz<TN...>::value;
};
template<typename T>
struct AllHazBaz<T>
{
static const bool value = HazBaz<T>::value;
};
template<bool implementBar, typename ...Ts>
struct FooBase
{
// Assuming that we do
virtual void bar()
{
// Do the things here
}
};
template<typename ...Ts>
struct FooBase<false, Ts...>
{
// Look ma, no bar!
};
template<typename ...Ts>
struct Foo : FooBase<AllHazBaz<Ts...>::value, Ts...>
{
};
编辑:Derp。把问题再读一遍。老实说,如果没有继承权,我不知道这怎么可能。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 在Ubuntu 16.04上安装Cilk时出现问题
- 导入库可以跨dll版本工作吗
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作
- 所有Visual Studio安装程序崩溃,可视化构建工具也无法正常工作
- 打开 CV 安装无法正常工作
- 在 centOS7 上安装 ceres-solver 并让 helloworld.cc 工作
- 柯南安装 --build 无法按预期工作
- C++ Dll 无法在未安装 Visual Studio 的系统上工作
- 创建不需要任何进一步安装即可在其他计算机上工作的可执行文件?
- 如何在Linux上从源代码安装TBB并使其工作
- 如何在虚拟方法中围绕安装进行工作
- 让qmake与32位和64位并行安装一起工作
- 正在安装GLFW 3.0,但无法在Visual Studio中工作
- 是否有人有一个工作GMP + MINGW安装
- 没有安装VS2012, c / c++ dll缺少依赖项.有了它,它工作得很好
- 自制安装g++ 4.7不工作
- Visual C++ 2013 程序在 IDE 中工作,但在 InstallShield LE 安装后不加载任何显示内容
- Qt5.7安装在Raspberry Pi3上并工作…如何获得QtCreator