首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据类型调用模板方法

数据类型调用模板方法
EN

Stack Overflow用户
提问于 2014-09-25 00:11:50
回答 3查看 62关注 0票数 0

如何使用不同的数据类型,而没有为每种类型编写一行代码的开销?

假设有一个接受任何数据类型的模板方法。我希望传入各种数据类型(int、double、string、char、...etc),而不为每种数据类型创建一行。有没有一种高效的方法来遍历不同的数据类型,并为每种数据类型调用模板方法?

示例代码:

代码语言:javascript
运行
复制
template <typename T>
sorted_vector<T>::sorted_vector( sorted_vector<value_type> const& rhs )
    : beg_( new value_type [rhs.size()] )
    , end_( beg_ + rhs.size() )
    , cap_( end_ )
{
    std::copy( rhs.beg_, rhs.end_, beg_ );
}

所以我的任务是测试有but的模板,但是想检查所有的value_types。我想测试一个向量,等等

EN

回答 3

Stack Overflow用户

发布于 2014-09-25 00:53:13

您可以使用可变模板进行循环:

代码语言:javascript
运行
复制
class Test
{
public:
    template <typename T>
    static void f()
    {
        // Your generic code to execute
        std::cout << typeid(T).name() << std::endl;
    }
};

template<typename F, typename ... Ts>
void Call()
{
    std::initializer_list<int>({ (F::template f<Ts>(), 0)... });
}

然后这样叫它:

代码语言:javascript
运行
复制
Call<Test, int, char, char*>();

但我不确定它是否比

代码语言:javascript
运行
复制
// Equivalent to
Test::f<int>();
Test::f<char>();
Test::f<char*>();
票数 1
EN

Stack Overflow用户

发布于 2014-09-25 00:21:01

很难理解你真正在问什么,因为你的问题太宽泛了。我建议研究一下boost::variant,特别是模式‘访问者’是如何在那里实现的。这并不意味着你必须使用这个库,但这可能是一个很好的起点,如何实现这样的逻辑。其他候选者将是std::tupleboost::any

票数 0
EN

Stack Overflow用户

发布于 2014-09-25 00:53:33

听起来像是模板元编程的案例。看看Boost的MPL的前沿:foreach

它们的示例所做的事情与您尝试做的一样:为列表的不同类型和值调用函数。

代码语言:javascript
运行
复制
struct value_printer
{
    template< typename U > void operator()(U x)
    {
        std::cout << x << 'n';
    }
};

int main()
{
    for_each< range_c<int,0,10> >( value_printer() );
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26021699

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档