Шаблон C ++: выбор перегруженных функций с использованием неявного преобразования в экземплярный тип шаблона! - PullRequest
0 голосов
/ 14 декабря 2010

Рассмотрим эти перегруженные функции,

void fun(Int2Type<1>) {}
void fun(Int2Type<2>) {}
void fun(Int2Type<3>) {}
void fun(Int2Type<4>) {}

Я хочу назвать их таким образом,

fun(1); // this should call first function
fun(4); // this should call fourth function

Есть ли способ сделать это?Если да, то можем ли мы сделать то же самое с некоторым значением времени выполнения, скажем, (обратите внимание, что в приведенных выше вызовах аргумент известен во время компиляции)

fun(value); // value can be decided at runtime!

Или какая-нибудь альтернатива, если это невозможно?Цель состоит в том, чтобы разные функции вызывались на основе разных интегральных значений!


РЕДАКТИРОВАТЬ

Кстати, я не могу использовать любое из следующего:

  1. Использование switch(value)
  2. Использование некоторых SomeFuncTable funTable[] = {fun(Int2Type<1>(), fun(Int2Type<2>()} и т. Д.

Ответы [ 3 ]

2 голосов
/ 14 декабря 2010

Невозможно выполнить то, что вы хотите, потому что все они сводятся к одной и той же вещи - таблице прыжков или большой серии if / else.Вот и все.Любая другая особенность станет именно этим.Просто сделай стол для прыжков.Вы можете использовать массив указателей на функции (самый быстрый) или что-то более гибкое, например unordered_map<int, std::function<void()>>.

О, если только вы не хотите писать свой собственный JIT-компилятор и JIT новый код сборки, когда вам это нужно.Вы могли бы сделать это.Но я на самом деле не вижу смысла, поскольку вы все еще сталкиваетесь с той же проблемой - как выбрать путь к коду, который должен стать таблицей переходов или цепочкой if / else.

2 голосов
/ 14 декабря 2010

Вы можете сделать это немного по-другому:

template<int N> void func();
template<> void func<1>(){/*the body*/}
template<> void func<2>(){/*the body*/}

И тогда вы можете позвонить: func<1>().

Или вы можете назвать исходный код так: func(Int2Type<1>()).

В любом случае все это работает только с константами времени компиляции.

2 голосов
/ 14 декабря 2010

Нет, нет способа использовать значения времени выполнения в качестве параметра шаблона. Единственное, что вы можете сделать, это что-то вроде:

void fun(int x) {
    switch(x) {
    case 1:
        fun(Int2Type<1>());
        break;
    case 2:
        fun(Int2Type<2>());
        break;
    case 3:
        fun(Int2Type<3>());
        break;
    case 4:
        fun(Int2Type<4>());
        break;
    }
}
...