如何使用不同的数据类型,而没有为每种类型编写一行代码的开销?
假设有一个接受任何数据类型的模板方法。我希望传入各种数据类型(int、double、string、char、...etc),而不为每种数据类型创建一行。有没有一种高效的方法来遍历不同的数据类型,并为每种数据类型调用模板方法?
示例代码:
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。我想测试一个向量,等等
发布于 2014-09-24 16:53:13
您可以使用可变模板进行循环:
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)... });
}
然后这样叫它:
Call<Test, int, char, char*>();
但我不确定它是否比
// Equivalent to
Test::f<int>();
Test::f<char>();
Test::f<char*>();
发布于 2014-09-24 16:21:01
很难理解你真正在问什么,因为你的问题太宽泛了。我建议研究一下boost::variant
,特别是模式‘访问者’是如何在那里实现的。这并不意味着你必须使用这个库,但这可能是一个很好的起点,如何实现这样的逻辑。其他候选者将是std::tuple
和boost::any
发布于 2014-09-24 16:53:33
听起来像是模板元编程的案例。看看Boost的MPL的前沿:foreach
它们的示例所做的事情与您尝试做的一样:为列表的不同类型和值调用函数。
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() );
}
https://stackoverflow.com/questions/26021699
复制