目前,我正在尝试在SFML之上编写GUI系统。现在,我也在实现简单的小部件。每个都有一个指向sf :: Drawables的指针向量(只是所有可绘制对象的基类)。在该向量中,存储窗口小部件的所有组件(例如,sf :: Text对象作为标题,sf :: ConvexShape对象用于按钮形状,依此类推)。
现在我想迭代所有组件,并在每个OBJECT POSSIBLE上调用一个名为'getGlobalBounds'的函数进行鼠标检查。问题是,并非所有sf :: Drawable派生都有此功能(例如,sf :: Text不具备)。如何在每个具有此函数实现的对象上调用此函数?
答案 0 :(得分:4)
As you can see here,它是提供const path = require('path');
const webpack = require('webpack');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const ExtractTextPlugin = require("extract-text-webpack-plugin");
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const CompressionPlugin = require("compression-webpack-plugin");
module.exports = {
entry: {
vendor: [
'./src/main/webapp/js/vendor/jquery-3.3.1.min.js',
// './src/main/webapp/js/vendor/fs.js',
'./src/main/webapp/js/vendor/google-adsense.js',
'./src/main/webapp/js/vendor/jquery.menu-aim.min.js',
'./src/main/webapp/js/vendor/jquery.touchSwipe.min.js',
],
app: './src/main/assets/js/desktop/app.js',
mobile: './src/main/assets/js/mobile/app.js',
touch: './src/main/assets/js/touch/app.js',
},
module: {
rules: [{
test: /\.js$/,
exclude: /(node_modules|bower_components)/,
use: {
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env']
}
}
},
{
test: /jquery.+\.js$/,
use: [{
loader: 'expose-loader',
options: 'jQuery'
},{
loader: 'expose-loader',
options: '$'
}]
}
],
},
plugins: [
// new CleanWebpackPlugin(['src/main/webapp/assets']),
new webpack.optimize.CommonsChunkPlugin({
name: 'common' // Specify the common bundle's name.
}),
new UglifyJsPlugin({
test: /\.js$/,
sourceMap: process.env.NODE_ENV === "development"
})
],
output: {
filename: '[name].js',
path: path.resolve(__dirname, './src/main/webapp/js')
},
externals: {
jquery: 'jQuery'
}
};
功能的sf::Sprite
类。
所以你想迭代你的vector并挑选出子类化的所有元素,然后调用它们的函数:
getGlobalBounds
如上所述,正如评论中所提到的,这不是一个理想的设计。也许你可以保持指向std::vector<sf::Drawable *> items;
for (sf::Drawable *item : items)
{
sf::Sprite *maybeSprite = dynamic_cast<sf::Sprite*>(item);
if (maybeSprite != nullptr) // Cast succeeded
{
maybeSprite->getGlobalBounds();
...
}
}
的指针向量,它是sf::Drawables
指针向量中指针的超集,并根据类型将项添加到一个或两个。然后,您只需要迭代知道提供该功能的项目,您就可以避免讨厌的sf::Sprites
。
答案 1 :(得分:0)
如果您想避免使用dynamic_cast,传统的SFINAE解决方案将是 -
template <class T>
struct has_getGlobalBounds
{
template <class U>
static auto foo(U &u) -> decltype(u.size());
static char foo(...);
T t;
static const bool value = !std::is_same<char, decltype(foo(t))>::value;
};
template<class T>
typename enable_if<!has_getGlobalBounds<T>::value, void>::type call_getGlobalBounds(const T& t)
{}
template<class T>
auto call_getGlobalBounds(const T& t) -> decltype(t.getGlobalBounds())
{
return t.getGlobalBounds();
}