2010-10-01 4 views
0

Что я делаю неправильно?Зачем мне это нужно?

#include "stdafx.h" 
#include <iostream> 
#include <string> 
using std::cout; 
using std::string; 

template<int v> 
struct Int2Type 
{ 
    enum {value = v}; 
}; 

template<bool condition,class Left, class Right> 
struct Result; 


template<class Left, class Right> 
struct Result<true,Left,Right> 
{ 
    typedef Left value; 
}; 

template<class Left, class Right> 
struct Result<false,Left,Right> 
{ 
    typedef Right value; 
}; 


struct Ternary 
{ 
    template<class Left, class Right> 
    static Right check_(Int2Type<false>, Left left, Right right) 
    { 
     return right; 
    } 

    template<class Left, class Right> 
    static Left check_(Int2Type<true>, Left left, Right right) 
    { 
     return left; 
    } 

    template<class Left, class Right> 
    static auto check(bool condition, Left left, Right right)-> decltype(Result<condition,Left,Right>::value) 
    { 
     return check_(Int2Type<condition>,left,right); 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int a = 5; 
    string s = "Hello"; 
    cout << Ternary::check(false,a,s); 
    return 0; 
} 

Я получаю сообщение об ошибке:
"Ошибка 1 ошибка C2893: Не удалось специализировать шаблон функции '' неизвестного типа 'ТРОЙНЫХ :: чек (BOOL, Left, Right)"

Почему ? EDIT

template<class Left, class Right> 
    static auto check(bool condition, Left left, Right right)-> 
     decltype(Result<(sizeof(int) == 1),Left,Right>::value) 
    { 
     return check_(Int2Type<condition>,left,right); 
    } 

добавил:

Result<(sizeof(int) == 1) 
+1

типы времени компилирования конструкции. Если вы не знаете параметры во время компиляции, вы не можете использовать этот тип. – GManNickG

+0

@GMan Я попытался с результатом :: value, но он не работает, а sizeof - оператор времени компиляции. Есть ли способ исправить это? –

+0

Что такое 'someexpression'? Это должно быть известно и во время компиляции ... – GManNickG

ответ

0
static auto check(bool condition, Left left, Right right)-> decltype(Result<condition,Left,Right>::value) 

Что ???

Вы не можете использовать переменную времени выполнения condition для параметризации шаблона во время компиляции !?

+0

Возможно, он имел в виду 'typeof (condition)'? ошибка ... но это не будет работать повсюду, не так ли? – FrustratedWithFormsDesigner

+0

Нет, первый параметр результата - значение 'bool'! – ybungalobill

2

condition здесь является переменной вашей программы.

Параметр шаблона должен быть константным выражением (или типом), поэтому переменная не подходит, поскольку компилятор не может выбрать правильную специализацию на основе информации о времени выполнения.

0

Просто писать (после удаления check):

cout << Ternary::check_(IntToType<false>,a,s); 
+0

Да, но я хочу, чтобы правильная проверка была выбрана в соответствии с первым параметром. –

+0

@There: вы * не можете * иметь возвращаемый тип функции, определенной во время выполнения на C++. – UncleBens

+0

@ Нет ничего ... (hoo what a nick!), Это именно то, что произойдет: В auto tResult = Ternary :: check_ (IntToType , a, s); tResult будет иметь тип «Right», в вашем примере std :: string, поскольку вы можете легко проверить по deltype (tResult) tOther = «обязательно строка». Как было указано из других плакатов, вы не можете использовать переменную (условие) во время выполнения как идентификатор шаблона класса. –