[英]Choosing a template instantiation at runtime though switch in C++
我有一組由整數類型Index
和類類型T
模板化的函數,我以下列方式“部分地專門化”:
// Integer type
enum Index{One,Two,Three,Four};
// Default implementation
template<int I>
struct Foo{
template<typename T> static void bar(const T& x){ std::cout <<"default" << endl; }
};
// Template specializations
template<>
struct Foo<One>{
template<typename T> static void bar(const T& x){ std::cout << "one" << endl; }
};
這用於在程序的運行時使用switch語句選擇一個特定的索引(這應該會產生一個高效的查找表)。 該開關獨立於T
:
template<typename T>
void barSwitch(int k, const T& x){
switch(k){
case ONE: Foo<ONE>::bar(x); break;
case TWO: Foo<TWO>::bar(x); break;
case THREE: Foo<THREE>::bar(x); break;
}
}
當然,這很好用,但是Foo
類並不是我想要應用這個開關的唯一類。 事實上,我有很多類都是由相同的整數類型模板化的。 所以我想用“Foo”函數“模板”上面的類barSwitch
,這樣我就可以插入不同的類或不同的函數。 我能想到的唯一方法是使用宏:
#define createBarSwitch(f,b) \
template<typename T> \
void barSwitch(int k, const T& x){ \
switch(k){ \
case ONE: f<ONE>::b(x); break; \
case TWO: f<TWO>::b(x); break; \
case THREE: f<THREE>::b(x); break; \
}\
}
有沒有更好的,更多的C ++風格的方式這樣做?
模板模板參數是關鍵:
enum Index { One, Two, Three, Four };
template <template <Index> class Switcher, typename T>
void barSwitch(int k, const T & x)
{
switch (k)
{
case 1: Switcher<One>::template bar<T>(x); break;
case 2: Switcher<Two>::template bar<T>(x); break;
default: assert(false);
}
}
用法:
template <Index I> struct Foo
{
template <typename T> static void bar(const T & x);
};
barSwitch<Foo>(1, Blue);
(當然,您有責任確保替換Switcher
每個可能模板都有成員模板bar
。如果沒有,您將收到編譯錯誤。)
template<template<int> class F>
struct BarFunc {};
template<>
struct BarFunc<Foo> {
template<Index I, typename T>
static void call(const T& x) {
Foo<I>::bar(x);
}
};
template<template<int> class F, typename T>
void barSwitch(int k, const T& x) {
switch(k){
case One: BarFunc<F>::call<One>(x); break;
case Two: BarFunc<F>::call<Two>(x); break;
case Three: BarFunc<F>::call<Three>(x); break;
}
}
您可以通過提供BarFunc特化來參數化要調用的函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.