向量元素上的C ++调用函数,派生自向量的基类

时间:2018-02-03 22:21:43

标签: c++ vector sfml

目前,我正在尝试在SFML之上编写GUI系统。现在,我也在实现简单的小部件。每个都有一个指向sf :: Drawables的指针向量(只是所有可绘制对象的基类)。在该向量中,存储窗口小部件的所有组件(例如,sf :: Text对象作为标题,sf :: ConvexShape对象用于按钮形状,依此类推)。

现在我想迭代所有组件,并在每个OBJECT POSSIBLE上调用一个名为'getGlobalBounds'的函数进行鼠标检查。问题是,并非所有sf :: Drawable派生都有此功能(例如,sf :: Text不具备)。如何在每个具有此函数实现的对象上调用此函数?

2 个答案:

答案 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();
}